#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; }
文章来源: 拓扑排序判断有向图是否成环