题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=1246
拓扑排序,直接dfs,具体看刘汝佳的《算法竞赛入门经典》。而且这道题目的题意是一定存在拓扑排序,所以更加简单。
#include<stdio.h> #include<string.h> #define MAXN 100+10 int vis[MAXN],edge[MAXN][MAXN],topo[MAXN],t,n; void dfs(int i) { int j; for(j=1;j<=n;j++) if(edge[i][j]&&!vis[j]) { vis[j]=1; dfs(j); } topo[t--]=i; } int main() { int i,m; for(;;) { scanf("%d%d",&n,&m); if(n==0&&m==0) break; memset(vis,0,sizeof(vis)); memset(edge,0,sizeof(edge)); while(m--) { int a,b; scanf("%d%d",&a,&b); edge[a][b]=1; } t=n; for(i=1;i<=n;i++) if(!vis[i]) { vis[i]=1; dfs(i); } for(i=1;i<=n;i++) { printf("%d",topo[i]); if(i==n) putchar('\n'); else putchar(' '); } } return 0; }