title

拓扑排序

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<iostream>
#include<queue>
#define rg register
using namespace std;
inline int read(){
	rg int f=0,x=0;
	rg char ch=getchar();
	while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
	while(isdigit(ch)) 	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}

const int N =110;
const int M =220;
int n,m,head[N],tot,a[N],cnt,deg[N];
queue<int > q;
struct edge{
	int to,nxt;
}e[M];
inline void add(int u,int v){
	e[++tot].to=v;
	e[tot].nxt=head[u];
	deg[v]++;
	head[u]=tot;
}
inline void topsort(){
	for(rg int i=1;i<=n;++i)	if(!deg[i])	q.push(i);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		a[++cnt]=u;
		for(rg int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(--deg[v]==0)	q.push(v);
		}
	}
}
signed main(){
	n=read(),m=read();
	for(rg int i=1,u,v;i<=m;++i){
		u=read(),v=read();
		add(u,v);
	}
	topsort();
	for(rg int i=1;i<=n;++i)	printf("%d ",a[i]);
	return 0;
}
posted @ 2018-09-10 01:06  Horrigue_JyowYang  阅读(92)  评论(0编辑  收藏  举报