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++] = '\0'; 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.\n",i); 72 } 73 else if (flag==1) 74 { 75 printf("Sorted sequence determined after %d relations: %s.\n",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.\n"); 84 } 85 return 0; 86 }

浙公网安备 33010602011771号