拓扑排序的实现:
一、删边法:
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);//用栈方便反向输出
}