一个合法的拓扑序(1 2 4 3 5)
#include <bits/stdc++.h> using namespace std; const int maxn=100000+15; const int maxm=100000+15; struct Edge { int x,y,next; Edge(int x=0,int y=0,int next=0):x(x),y(y),next(next){} }edge[maxm]; int sumedge,head[maxn]; int n,m; int ins(int x,int y) { edge[++sumedge]=Edge(x,y,head[x]); return head[x]=sumedge; } int h,t,line[maxn],ind[maxn]; int money[maxn]; bool boo[maxn]; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); ins(u,v); ind[v]++; } h=1;t=0; int ss=888; for (int i=1;i<=n;i++) if (ind[i]==0) line[++t]=i,money[i]=ss; // dp[i]=max(dp[j])+1 ((j,i)) for (;h<=t;) { ss++; int now=t; for (;h<=now;h++) for (int u=head[line[h]];u;u=edge[u].next) { ind[edge[u].y]--; if (ind[edge[u].y]==0) line[++t]=edge[u].y,money[i]=ss; } } for (int i=1;i<=n;i++) printf("%d ",line[i]); printf("\n"); return 0; }
原文:http://www.cnblogs.com/9pounds15pence/p/6349706.html