拓扑排序的实现:

一、删边法:

void toposort(){
	for(int i=1;i<=n;i++)if(d[i]==0)q.push(i);	
	while(!q.empty()){
		int u=q.front();
		q.pop();
		a.push(u); 
		for(int i=0;i<g[u].size();i++){
			int v=g[u][i];
			d[v]--;
			if(d[v]==0)q.push(v); 
		}
	}
	if(a.size()==n){
		while(!q.empty()){
			cout<<q.top()<<" "
			q.pop();
		}
	}else cout<<"It's a cycle!";
}

二、 dfs

void toposort(u){
	flag[u]=1;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(flag[v]==1){
			cout<<"It's a cycle!";
			exit(0);
		}else if(flag[v]==0)dfs(v);
	}
	flag[u]=-1;
	a.push(u);//用栈方便反向输出 
}