hdu1811 Rank of Tetris 並查集+拓撲排序
阿新 • • 發佈:2017-09-02
namespace str tin i++ 自己 sca col color mem
1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 struct node//邊 7 { 8 int a, b;//頂點 9 char ch;//運算符 10 }c[10005]; 11 vector<int>map[10005];//map數組存貯鄰接表 (大佬都是這麽開數組的) 12 intn, m, sum, in[10005], fa[10005];//in數組表示入度,fa[i]表示頂點i所在集合的根節點 13 14 int find(int x)//查找根節點 15 { 16 if (fa[x] != x) fa[x] = find(fa[x]); 17 return fa[x]; 18 } 19 20 bool comb(int x, int y)//合並集合 21 { 22 x = find(x); 23 y = find(y); 24 if (x == y) 25 returnfalse; 26 else 27 { 28 fa[y] = x; 29 return true; 30 } 31 } 32 33 void init()//初始化 34 { 35 for (int i = 0; i<n; i++) 36 fa[i] = i; 37 } 38 39 void top_sort()//queue實現拓撲排序 40 { 41 queue<int>s; 42 int flag = 0;43 for (int i = 0; i<n; i++) 44 { 45 //找到入度為零的切祖宗為自己的加入到隊列中 46 if (in[i] == 0 && fa[i] == i) 47 s.push(i); 48 } 49 while (!s.empty()) 50 { 51 if (s.size() > 1)//即使發現信息不完整也要繼續運行下去,因為如果信息同時不完整和沖突都是CONFLICT 52 flag = 1; 53 int pos = s.front(); 54 s.pop(), sum--; //記錄下運行的次數 55 for (int i = 0; i<map[pos].size(); i++) 56 { 57 in[map[pos][i]]--; 58 if (in[map[pos][i]] == 0) 59 s.push(map[pos][i]); 60 } 61 } 62 if (sum>0) printf("CONFLICT\n"); //沖突,即有多個入度為零且祖宗為自己的出現 63 else if (flag) printf("UNCERTAIN\n"); 64 else printf("OK\n"); 65 } 66 67 int main() 68 { 69 while (scanf("%d %d", &n, &m) != EOF) 70 { 71 sum = n; 72 init(); 73 memset(map, 0, sizeof(map)); 74 memset(in, 0, sizeof(in)); 75 for (int i = 0; i<m; i++) 76 { 77 scanf("%d %c %d", &c[i].a, &c[i].ch, &c[i].b); 78 //如果相等,就合並為同一個集合 79 if (c[i].ch == ‘=‘) 80 { 81 if (comb(c[i].a, c[i].b)) 82 sum--; 83 } 84 } 85 for (int i = 0; i<m; i++) 86 { 87 if (c[i].ch == ‘=‘) 88 continue; 89 int x = find(c[i].a); 90 int y = find(c[i].b); 91 if (c[i].ch == ‘>‘) 92 { 93 map[x].push_back(y); 94 in[y]++; 95 } 96 else 97 { 98 map[y].push_back(x); 99 in[x]++; 100 } 101 } 102 top_sort(); 103 } 104 //system("pause"); 105 return 0; 106 }
hdu1811 Rank of Tetris 並查集+拓撲排序