uva 10305

本文深入探讨了拓扑排序算法的原理及其在《算法入门经典》中的实例应用,通过C语言实现,详细解析了从输入数据到拓扑排序结果的全过程。

这是一道纯粹的拓扑排序,刘汝佳的《算法入门经典》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

 

转载于:https://www.cnblogs.com/Shirlies/archive/2012/03/01/2376348.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值