有向图的拓扑序列
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=1e5+10; int n,m; int h[N],e[N],ne[N],idx; int d[N];//入线 int q[N]; void add(int a,int b){ e[idx]=b; ne[idx]=h[a]; h[a]=idx++; } bool topsort() { int hh = 0, tt = -1; for (int i = 1; i <= n; i ++ ) if (!d[i]) q[ ++ tt] = i; while (hh <= tt) { int t = q[hh ++ ]; for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (-- d[j] == 0) q[ ++ tt] = j; } } return tt == n - 1; } int main(){ cin>>n>>m; int a,b; memset(h,-1,sizeof(h)); for (int i = 0; i < m; i ++ ){ cin>>a>>b; add(a,b); d[b]++; } if(!topsort()) cout<<"-1"<<endl; else for(int i=0;i<n;i++){ printf("%d ",q[i]); } return 0; }