hdu 1811 Rank of Tetris(拓扑排序+并查集)

不熟悉的点:

1.并查集的按秩压缩

2.vector建图

3.bfs拓扑排序

 1 #include "cstdio"
 2 #include "iostream"
 3 #include "cstring"
 4 #include "vector"
 5 #include "queue"
 6 using namespace std;
 7 const int N = 10005;
 8 int n, m, t;
 9 int fa[N];
10 int X[2 * N], Y[2 * N];
11 int son[N];
12 char O[2 * N];
13 vector<int>G[N];
14 
15 void init(int n)
16 {
17     for (int i = 0; i <= n; ++i)
18         fa[i] = -1;
19     for (int i = 0; i <= n; ++i)
20         G[i].clear();
21     memset(son, 0, sizeof(son));
22 }
23 int find(int x)
24 {
25     if (fa[x] < 0) return x;
26     return fa[x] = find(fa[x]);
27 }
28 
29 bool merg(int a, int b)
30 {
31     int x = find(a);
32     int y = find(b);
33     if (x == y) return false;
34     else if (x < y){
35         fa[x] += fa[y];
36         fa[y] = x;
37     }
38     else {
39         fa[y] += fa[x];
40         fa[x] = y;
41     }
42     return true;
43 }
44 
45 int main()
46 {
47     while (cin >> n >> m) {
48         init(n);
49         int num = n;
50         for (int i = 0; i < m; ++i) {
51             cin >> X[i] >> O[i] >> Y[i];
52             if (O[i] == '=') {
53                 if (merg(X[i], Y[i]))
54                     num--;
55             }
56         }
57         for (int i = 0; i < m; ++i) if (O[i] != '=') {
58             int x = find(X[i]);
59             int y = find(Y[i]);
60             if (O[i] == '>') {
61                 G[x].push_back(y);
62                 son[y]++;
63             }
64             else {
65                 G[y].push_back(x);
66                 son[x]++;
67             }
68         }
69         queue<int> q;
70         for (int i = 0; i < n; ++i)
71             if (son[i] == 0 && i == find(i))
72                 q.push(i);
73         int sin = 0;
74         while (!q.empty()) {
75             if (q.size() > 1) sin = 1;
76             int t = q.front();
77             q.pop();
78             --num;
79             for (int v = 0; v < G[t].size(); ++v) {
80                 if (--son[G[t][v]] == 0)
81                     q.push(G[t][v]);
82             }
83         }
84         if (num > 0) cout << "CONFLICT" << endl;
85         else if (sin) cout << "UNCERTAIN" << endl;
86         else cout << "OK" << endl;
87     }
88     return 0;
89 }
原文地址:https://www.cnblogs.com/usedrosee/p/4242897.html