标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 30187 | Accepted: 10442 |
Description
Input
Output
Sample Input
4 6 A<B A<C B<C C<D B<D A<B 3 2 A<B B<A 26 1 A<Z 0 0
Sample Output
Sorted sequence determined after 4 relations: ABCD. Inconsistency found after 2 relations. Sorted sequence cannot be determined.
题意:
三种情况: 1. 在第x个关系中可以唯一的确定排序,并输出。
2. 在第x个关系中发现了有回环(Inconsisitency矛盾)
3.全部关系都没有发现上面两种情况,输出第3种.
要求对于给定的m个关系,一个个的读进去,每读进去一次就要进行一次拓扑排序,如果发现情况1和情况2,那么就不用再考虑后面的那些关系了,但是还要继续读完后面的关系(但不处理)。如果读完了所有关系,还没有出现情况1和情况2,那么就输出情况3.
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <fstream> 5 using namespace std; 6 7 int grap[27][27]; 8 int indeg[26],temp[26]; 9 int n,m; 10 char seq[26]; 11 12 int topSort() 13 { 14 int flag = 1; 15 memcpy(temp,indeg,sizeof(indeg)); 16 memset(seq, ‘\0‘,sizeof(seq)); 17 for(int i = 0; i < n; i++) 18 { 19 int times = 0,loc; 20 for(int j = 0; j < n; j++) 21 { 22 if(temp[j] == 0) 23 { 24 times++; 25 loc = j; 26 } 27 } 28 if(times > 1) flag = -1; 29 if(times == 0) return 0; 30 temp[loc]--; 31 seq[i] = ‘A‘+ loc; 32 for(int k = 0; k < n; k++) 33 { 34 if(grap[loc][k]) 35 { 36 temp[k]--; 37 } 38 } 39 } 40 return flag; 41 } 42 43 int main() 44 { 45 while(cin >> n >> m) 46 { 47 if(n == 0 && m == 0) 48 break; 49 50 memset(grap,0,sizeof(grap)); 51 memset(indeg,0,sizeof(indeg)); 52 bool ok = false; 53 54 for(int i = 0; i < m; i++) 55 { 56 string ss; 57 cin >> ss; 58 if(ok) continue; 59 int row,col; 60 row = ss[0] - 65; 61 col = ss[2] - 65; 62 if(grap[row][col] == 0) 63 { 64 grap[row][col] = 1; 65 indeg[col]++; 66 } 67 68 int flag = topSort(); 69 if(flag==1) 70 { 71 ok = true; 72 cout << "Sorted sequence determined after " << i+1 << " relations: " << seq << "."<<endl; 73 } 74 else if(flag==0) 75 { 76 ok = true; 77 cout << "Inconsistency found after " << i+1 << " relations." << endl; 78 } 79 } 80 81 if(!ok) 82 { 83 cout << "Sorted sequence cannot be determined." << endl; 84 } 85 } 86 87 return 0; 88 }
标签:
原文地址:http://www.cnblogs.com/cjshuang/p/4720615.html