Shirlies
宁静专注认真的程序媛~

这是一道纯粹的拓扑排序,刘汝佳的《算法入门经典》p110里面有例题.

 1 #include "stdio.h"
2 #include "string.h"
3
4 int task[102][102];
5 int vis[102];
6 int n,m;
7 int k;
8 int topo[102];
9
10 int dfs(int u);
11 void toposort(void);
12
13 int main()
14 {
15 int i;
16 int a,b;
17 while(scanf("%d%d",&n,&m)==2)
18 {
19 if(!n&&!m)
20 break;
21
22 memset(task,0,sizeof(task));
23 memset(vis,0,sizeof(vis));
24
25 for(i=0;i<m;i++)
26 {
27 scanf("%d%d",&a,&b);
28 task[a][b]=1;
29 }
30 k=n-1;
31
32 toposort();
33
34 for(i=0;i<n-1;i++)
35 printf("%d ",topo[i]);
36 printf("%d\n",topo[n-1]);
37
38 }
39
40 return 0;
41 }
42
43 int dfs(int u)
44 {
45 int i;
46 vis[u]=-1;
47
48 for(i=1;i<=n;i++)
49 {
50 if(task[u][i])
51 {
52 if(vis[i]==-1)
53 return 0;
54 else if(!vis[i]&&!dfs(i))
55 return 0;
56 }
57 }
58
59 vis[u]=1;
60 topo[k--]=u;
61 return 1;
62 }
63
64 void toposort()
65 {
66 int i;
67
68 for(i=1;i<=n;i++)
69 {
70 if(!vis[i])
71 {
72 dfs(i);
73 }
74 }
75 }
76
77

 

posted on 2012-03-01 22:38  Shirlies  阅读(890)  评论(0编辑  收藏  举报