POJ 1094 Sorting It All Out(拓扑排序)
其实我不懂拓扑排序啊。。。看了DISCUSS,需要判断是不是有环,我傻呼呼的写了个DFS。。。拓扑排序没学好啊。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 char str[10001][4],ch[31]; 8 int in[50],out[50],o[301],in2[50],out2[50],z[27]; 9 int p[51][51],n,p2[51][51],flag; 10 int judge() 11 { 12 int i,j,num,t,t2; 13 for(i = 1; i <= n; i ++) 14 { 15 in2[i] = in[i]; 16 out2[i] = out[i]; 17 } 18 for(i = 1; i <= n; i ++) 19 { 20 for(j = 1; j <= n; j ++) 21 p2[i][j] = p[i][j]; 22 } 23 flag = 0; 24 for(i = 1; i <= n; i ++) 25 { 26 num = 0; 27 for(j = 1; j <= n; j ++) 28 { 29 if(in2[j] == 0) 30 { 31 num ++; 32 t = j; 33 } 34 else if(in2[j]) 35 { 36 t2 = j; 37 } 38 } 39 if(num > 1) 40 flag = 1; 41 if(num == 0) 42 return 0; 43 for(j = 65; j <= 90; j ++) 44 { 45 if(o[j] == t) 46 { 47 ch[i-1] = j; 48 break; 49 } 50 } 51 in2[t] = -1; 52 for(j = 1; j <= 26; j ++) 53 { 54 if(p2[t][j]) 55 { 56 in2[j] --; 57 p2[t][j] = 0; 58 } 59 } 60 } 61 if(flag) return 2; 62 ch[n] = '\0'; 63 return 1; 64 } 65 int main() 66 { 67 int m,i,t1,t2,num; 68 while(scanf("%d%d",&n,&m)!=EOF) 69 { 70 if(!n&&!m) break; 71 memset(in,0,sizeof(in)); 72 memset(out,0,sizeof(out)); 73 memset(p,0,sizeof(p)); 74 memset(o,0,sizeof(o)); 75 for(i = 1; i <= m; i ++) 76 scanf("%s",str[i]); 77 num = 1; 78 for(i = 1; i <= m; i ++) 79 { 80 t1 = str[i][0]; 81 t2 = str[i][2]; 82 if(!o[t1]) 83 { 84 o[t1] = num ++; 85 } 86 if(!o[t2]) 87 { 88 o[t2] = num ++; 89 } 90 } 91 for(i = 1; i <= m; i ++) 92 { 93 t1 = str[i][0]; 94 t2 = str[i][2]; 95 p[o[t1]][o[t2]] = 1; 96 out[o[t1]] ++; 97 in[o[t2]] ++; 98 if(judge() == 1) 99 { 100 printf("Sorted sequence determined after %d relations: %s.\n",i,ch); 101 break; 102 } 103 else if(judge() == 0) 104 { 105 printf("Inconsistency found after %d relations.\n",i); 106 break; 107 } 108 } 109 if(i == m+1) 110 printf("Sorted sequence cannot be determined.\n"); 111 } 112 return 0; 113 }