拓扑排序判断有向图是否成环

匿名 (未验证) 提交于 2019-12-03 00:27:02


#include <cstdio> #include <cstring> #include<iostream> #include <queue> using namespace std; const int maxn = 1e5 + 7;  int n,m, du[maxn], head[maxn], tot,cnt,ans[maxn]; struct node {     int v, next; } edge[maxn]; queue<int>q; void add(int u, int v) {     edge[tot].v = v;     edge[tot].next = head[u];     head[u] = tot++; } void init() {     tot = 0;     memset(du, 0, sizeof(du));     memset(head, -1, sizeof(head)); } void solve() {     while(!q.empty()) {         int u = q.front();         q.pop();         ans[cnt++]=u;         for (int i = head[u] ; i != -1 ; i = edge[i].next) {             du[edge[i].v]--;             if (!du[edge[i].v]) q.push(edge[i].v);         }     } } int main() {      int x,y;     scanf("%d",&n);     init();     for (int i = 1 ; i <= n ; i++) {         while(scanf("%d",&x)!=EOF&&x!=0){        add(i,x);       du[x]++;}     }     for (int i = 1 ; i <= n ; i++)         if (!du[i]) q.push(i);     solve();     if(cnt==m)     {         for(int i=0;i<cnt;i++)             cout<<ans[i]<<" ";         cout<<endl;     }     else         cout<<"有向图成环"<<endl;     return 0; } 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!