http://acm.hdu.edu.cn/showproblem.php?pid=1285
拓扑排序 小心重边
View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=510; 6 int g[N][N],ind[N],n; 7 int topo[N]; 8 bool toposort() 9 { 10 for(int i=1;i<=n;i++) 11 { 12 int u; 13 for(u=1;u<=n;u++) 14 if(ind[u]==0) break; 15 if(u>n) return false; 16 topo[i]=u; ind[u]--; 17 for(int v=1;v<=n;v++) 18 if(g[u][v]) ind[v]--; 19 } 20 return true; 21 } 22 int main() 23 { 24 int m; 25 while(~scanf("%d%d",&n,&m)) 26 { 27 memset(g,0,sizeof(g)); 28 memset(ind,0,sizeof(ind)); 29 for(int i=0;i<m;i++) 30 { 31 int u,v; 32 scanf("%d%d",&u,&v); 33 if(g[u][v]) continue; 34 g[u][v]=1; 35 ind[v]++; 36 } 37 toposort(); 38 for(int i=1;i<n;i++) printf("%d ",topo[i]); 39 printf("%d\n",topo[n]); 40 } 41 return 0; 42 }