您的位置:首页 > 其它

【HDOJ】1811 Rank of Tetris

2014-06-06 12:04 281 查看
并查集+拓扑排序。使用并查集解决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<<1],srcb[MAXN<<1];
char op[MAXN<<1];
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=0; i<n; ++i) {
nodes[i].count = 0;
nodes[i].first = NULL;
pre[i] = i;
}
for (i=0; 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=0; 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 = 0;
for (i=0; i<n; ++i) {
if (i==find(i)) {
++m;
if (nodes[i].count==0)
que.push(i);
}
}
while (!que.empty()) {
if (que.size() > 1)
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 == 0)
que.push(j);
p = p->next;
}
}
if (m)
printf("CONFLICT\n");
else if (flag)
printf("UNCERTAIN\n");
else
printf("OK\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: