1. 程式人生 > 其它 >拓撲排序(寬搜的一個應用)

拓撲排序(寬搜的一個應用)

//需要儲存每一個點的入度
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N=1e5+10; int h[N],e[N],ne[N],idx; void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } int n,m; int du[N],q[N]; int topsort() { int hh=0,tt=-1; for (int i=1;i<=n;i++) {
if (!du[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]; du[j]--; if (!du[j])q[++tt]=j; } } return tt==n-1; } int main() { memset(h,-1,sizeof h); cin>>n>>m;
while (m--) { int u,v; cin>>u>>v; add(u,v); du[v]++; } if (topsort()) { for (int i=0;i<n;i++) { if(!i) printf("%d",q[i]); else printf(" %d",q[i]); } puts(""); } else
puts("-1"); return 0; }