#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;
const int M = 10005;
/*
很好的题目, 对于没有等号的关系, 我们只用拓扑排序就能解决,
但是, 对于等于的关系,就不好解决了, 这里用并查集来辅助,当两点相等时
将其合并, 只看本集合的根元素即可,
*/
struct node {
int x;
char str[3];
int y;
}s[M*2];
int Set[M];
int du[M];
int n, m;
void init() {
for(int i = 0; i < n; i++) {
Set[i] = i;
du[i] = 0;
}
}
int Find(int x) {
return x == Set[x] ? x : Set[x] = Find(Set[x]);
}
void Union(int x, int y) {
if(x != y) {
Set[x] = y;
}
}
int main()
{
int a, b;
int ans;
bool flag, sign;
while(scanf("%d%d", &n, &m) != EOF) {
vector<int>road[M];
flag = true;
sign = true;
ans = n;
init();
for(int i = 0; i < m; i++) {
scanf("%d%s%d", &s[i].x, s[i].str, &s[i].y);
if(s[i].str[0] == '=') {
a = Find(s[i].x);
b = Find(s[i].y);
ans--;
Union(a, b);
}
}
for(int i = 0; i < m; i++) {
if(s[i].str[0] == '=')
continue;
a = Find(s[i].x);
b = Find(s[i].y);
if(a == b)
flag = false;
if(s[i].str[0] == '<') {
du[a]++;
road[b].push_back(a);
}
else {
du[b]++;
road[a].push_back(b);
}
}
queue<int>que;
for(int i = 0; i < n; i++) {
a = Find(i);
if(!du[a] && Set[a] == i) {
que.push(a);
}
}
while(!que.empty()) {
b = que.front();
que.pop();
ans--;
if(!que.empty())
sign = false;
for(int i = 0; i < road[b].size(); i++) {
a = road[b][i];
du[a]--;
if(!du[a])
que.push(a);
}
}
if(ans>0||!flag)printf("CONFLICT\n");
else if(!sign) printf("UNCERTAIN\n");
else printf("OK\n");
}
return 0;
}
hdu1811
最新推荐文章于 2020-10-17 10:30:07 发布