Sorting It All Out(拓扑排序)

http://poj.org/problem?id=1094

1.判断所给关系是否为合法的拓扑序列,若存在环,输出

"Inconsistency found after %d relations."但仍继续输入。

2.判断是否可以确定序列,若不可以确定,继续输入,若可以确定输出

"Sorted sequence determined after %d relations: %s."后,继续输入数据。

3.若输入完数据仍不可以确定序列,输出"Sorted sequence cannot be determined.".

 1 #include<stdio.h>
 2 #include<string.h>
 3 const int N=102;
 4 int map[N][N],in[N],vis[N];
 5 int n,m,flag,top;
 6 char s[N];
 7 void topo()
 8 {
 9     int cnt,i,j,pos;
10     top = 0;
11     int d[N];//存每个点的度数
12     flag = 1;
13     memset(vis,0,sizeof(vis));
14     memcpy(d,in,n*sizeof(int));
15     for (i = 0; i < n; i ++)
16     {
17         cnt = 0;
18         for (j = 0; j < n; j ++)
19         {
20             if (d[j]==0)
21             {
22                 cnt++;
23                 pos = j;
24             }
25         }
26         if (cnt==0)//存在环
27         {
28             flag = 0;
29             return ;
30         }
31         if (cnt > 1)//不确定序列
32         {
33             flag = 2;
34         }
35         --d[pos];
36         s[top++] = pos+'A';
37         for (int k =  0; k < n; k ++)
38         {
39             if(map[pos][k]==1)
40                 --d[k];//更新度数
41         }
42     }
43     s[top++] = '';
44 
45 }
46 int main()
47 {
48     while(~scanf("%d%d%*c",&n,&m))
49     {
50         if (n==0 && m==0)
51             break;
52         flag = 0;
53         memset(in,0,sizeof(in));
54         memset(map,0,sizeof(map));
55         char a,b,c;
56         int i;
57         for (i = 1; i <= m; i ++)
58         {
59             scanf("%c%c%c%*c",&a,&b,&c);
60             if (flag)//控制输入
61                 continue;
62             if (!map[a-'A'][c-'A'])
63             {
64                 map[a-'A'][c-'A'] = 1;
65                 in[c-'A']++;
66             }
67             topo();
68             if (flag==0)
69             {
70                 flag = 1;//以便能继续输入下面的点
71                 printf("Inconsistency found after %d relations.
",i);
72             }
73             else if (flag==1)
74             {
75                 printf("Sorted sequence determined after %d relations: %s.
",i,s);
76             }
77             else if (flag==2)//无法确定序列,继续输入
78             {
79                 flag = 0;//继续拓扑
80             }
81         }
82         if (flag==0)//输入完也无法确定序列
83             printf("Sorted sequence cannot be determined.
");
84     }
85     return 0;
86 }
View Code
原文地址:https://www.cnblogs.com/lahblogs/p/3260911.html