Rank of Tetris 並查集+拓撲排序★★
阿新 • • 發佈:2018-11-01
題目:https://blog.csdn.net/yao1373446012/article/details/52131283?utm_source=blogxgwz0
AC程式碼:
#include<bits/stdc++.h> using namespace std; struct Edg//邊 { int u, v;//頂點 char op;//運算子 }edg[10005]; vector<int>Mp[10005];//Mp陣列存貯鄰接表 int n, m, sum, In[10005], Father[10005];//In陣列表示入度,Father[i]表示頂點i所在集合的根節點 int FindFather(int x)//查詢根節點 { return Father[x] == x ? x : FindFather(Father[x]); } bool Umerge(int x, int y)//合併集合 { x = FindFather(x); y = FindFather(y); if (x == y) return false; else { Father[y] = x; return true; } } void init()//初始化 { for (int i = 0; i<n; i++) Father[i] = i; //重點注意 :遍歷到N :不然,資料 3 3 1 > 2 1 =4 2 = 4 輸出為錯誤答案OK。 memset(Mp, 0, sizeof(Mp)); memset(In, 0, sizeof(In)); } void top_sort()//queue實現拓撲排序 { queue<int>s; int flag = 0; for (int i = 0; i<n; i++) { if (In[i] == 0 && Father[i] == i) s.push(i); } while (!s.empty()) { if (s.size()>1)//即使發現資訊不完整也要繼續執行下去,因為如果資訊同時不完整和衝突都是CONFLICT flag = 1; int pos = s.front(); s.pop(), sum--; for (int i = 0; i<Mp[pos].size(); i++) { In[Mp[pos][i]]--; if (In[Mp[pos][i]] == 0) s.push(Mp[pos][i]); } } if (sum>0) printf("CONFLICT\n"); else if (flag) printf("UNCERTAIN\n"); else printf("OK\n"); } int main() { while (cin >> n >> m) { sum = n; init(); for (int i = 0; i<m; i++) { cin >> edg[i].u >> edg[i].op >> edg[i].v; if (edg[i].op == '=') { if (Umerge(edg[i].u, edg[i].v)) sum--; } } for (int i = 0; i<m; i++) { if (edg[i].op == '=') continue; int x = FindFather(edg[i].u); int y = FindFather(edg[i].v); if (edg[i].op == '>') { Mp[x].push_back(y); In[y]++; } else { Mp[y].push_back(x); In[x]++; } } top_sort(); } }