【HDOJ】1811 Rank of Tetris

时间:2023-03-08 22:31:58

并查集+拓扑排序。使用并查集解决a = b的情况。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; #define MAXN 10005 typedef struct ArcNode {
int adjvex;
ArcNode *next;
} ArcNode; typedef struct VNode {
int count;
ArcNode *first;
} VNode; VNode nodes[MAXN];
int pre[MAXN], n;
int srca[MAXN<<],srcb[MAXN<<];
char op[MAXN<<];
bool flag; int find(int x) {
int r = x;
while (r != pre[r])
r = pre[r];
return r;
} void merge(int a, int b) {
int x = find(a);
int y = find(b);
pre[x] = y;
} void Insert(int x, int y) {
ArcNode *p = new ArcNode;
nodes[y].count++;
p->adjvex = y;
p->next = nodes[x].first;
nodes[x].first = p;
} int main() {
int m;
int i, j, x, y; while (scanf("%d %d",&n,&m) != EOF) {
for (i=; i<n; ++i) {
nodes[i].count = ;
nodes[i].first = NULL;
pre[i] = i;
}
for (i=; i<m; ++i) {
scanf("%d %c %d", &srca[i], &op[i], &srcb[i]);
if (op[i] == '=')
merge(srca[i], srcb[i]);
}
flag = false;
for (i=; i<m; ++i) {
if (op[i] == '=')
continue;
x = find(srca[i]);
y = find(srcb[i]);
if (x == y) {
flag = true;
break;
}
if (op[i] == '>')
Insert(x, y);
else
Insert(y, x);
}
if (flag) {
printf("CONFLICT\n");
continue;
}
queue<int> que;
int index;
ArcNode *p;
m = ;
for (i=; i<n; ++i) {
if (i==find(i)) {
++m;
if (nodes[i].count==)
que.push(i);
}
}
while (!que.empty()) {
if (que.size() > )
flag = true;
index = que.front();
que.pop();
p = nodes[index].first;
--m;
while (p != NULL) {
j = p->adjvex;
--nodes[j].count;
if (nodes[j].count == )
que.push(j);
p = p->next;
}
}
if (m)
printf("CONFLICT\n");
else if (flag)
printf("UNCERTAIN\n");
else
printf("OK\n");
} return ;
}