这道题麻烦的就是有两个数相等的情况出现
我们使用并查集,将相等的并在一起
再用拓扑排序
将入度为0的点push进去
1.队列里面如果有>=2的点,那么代表这信息不完全不能判断
2.如果入队的次数小于n,那么代表有环,有冲突
/********************************************
Author :Crystal
Created Time :
File Name :
********************************************/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#include <cctype>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
#define MEM(a,b) memset(a,b,sizeof a)
#define CLR(a) memset(a,0,sizeof a);
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
//#define LOCAL
int u[20000];
int v[20000];
char ch[20000][2];
int par[20000];
int cnt[20000];
std::vector<int> g[20000];
int find(int x){
return x == par[x] ?x : find(par[x]);
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
// freopen("out.txt","w",stdout);
#endif
int n,m;
while(cin >>n >>m){
CLR(cnt);
int ccnt = 0;
for(int i=0;i<n;i++){
g[i].clear();
}
for(int i=1;i<=m;i++){
scanf("%d%s%d",&u[i],ch[i],&v[i]);
}
for(int i=0;i<=n;i++)par[i] = i;
for(int i=1;i<=m;i++){
if(ch[i][0]=='='){
int x = find(u[i]);
int y = find(v[i]);
if(x!=y)par[x] = y,ccnt++;
}
}
for(int i=1;i<=m;i++){
if(ch[i][0]!='='){
int x = find(u[i]);
int y = find(v[i]);
if(ch[i][0]=='>'){
g[x].push_back(y);
cnt[y]++;
}
else{
g[y].push_back(x);
cnt[x]++;
}
}
}
queue<int> q;
for(int i=0;i<n;i++){
if(cnt[i]==0 && i == find(i)){
q.push(i);
ccnt++;
}
}
int flag1 = 0;
int flag2 = 0;
//cout << q.size() << endl;
while(!q.empty()){
if(q.size() > 1){
flag1 = 1;
}
int u = q.front();
q.pop();
for(int i=0;i<g[u].size();i++){
cnt[g[u][i]]--;
if(cnt[g[u][i]]==0 && g[u][i] == find(g[u][i])){
q.push(g[u][i]);
ccnt++;
}
}
}
//cout <<flag2 << flag1 <<endl;
if(ccnt < n){
flag2 = 1;
}
if(flag1 && flag2){
printf("CONFLICT\n");
}
else if(flag1){
printf("UNCERTAIN\n");
}
else if(flag2){
printf("CONFLICT\n");
}
else{
printf("OK\n");
}
}
return 0;
}