URAL1022(拓扑排序)

解题思路:题目全英的,理解起来有点困难。刚开始我推测着应该是有向图中找一条包含所有顶点的通路,结果还是不对。如果早知道是拓扑排序就好办了。这是数据结构中的经典算法,首先找到入度为0的点,输出并去掉该顶点与其他顶点相连的边,然后依次循环上述操作,直到所有顶点都输出。 需要定义一个存放顶点入度的数组(degree), 最多100个顶点,所有可以用邻接矩阵存储有向图的结构,如果顶点过多,则应采用邻接表作有向图的存储结构。虽然题目中有不存在的情况,可是根据推断得知必定存在这样的序列。由程序提交 结果验证确实如此。不过考虑到该情况也不会出错,就是麻烦些。
ExpandedBlockStart.gif View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4  using  namespace std;
 5  int map[ 105][ 105];
 6  int degree[ 105],visit[ 105];
 7  int main()
 8 {
 9      int i,j,n,x,y,k;
10      while(scanf( " %d ",&n)!=EOF)
11     {
12         memset(degree, 0, sizeof(degree));
13         memset(map, 0, sizeof(map));
14         memset(visit, 0, sizeof(visit));
15          for(i= 1;i<=n;i++)
16         {
17             scanf( " %d ",&x);
18              while(x!= 0)
19             {
20                 map[i][x]= 1;
21                 degree[x]++;
22                 scanf( " %d ",&x);
23             }
24         }
25          for(i= 1;i<=n;i++)
26              if(degree[i]== 0&&!visit[i]){
27                 visit[i]= 1;
28                 printf( " %d ",i);
29                  break;
30             }
31              for(j= 1;j<=n;j++)
32                  if(map[i][j])degree[j]--;
33                 k= 1;
34                  while(k<n)
35                 {
36                      for(i= 1;i<=n;i++)
37                          if(degree[i]== 0&&!visit[i]){
38                             visit[i]= 1;
39                             printf( "  %d ",i);
40                             k++;
41                              break;
42                         }
43                          for(j= 1;j<=n;j++)
44                              if(map[i][j])degree[j]--;
45                 }
46                 printf( " \n ");
47     }
48      return  0;
49 }

转载于:https://www.cnblogs.com/yueshuqiao/archive/2012/05/05/2484467.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值