并查集+拓扑排序
#include<iostream>
#include<cstring>
#include<cstdio>
#include<math.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,sum;
int pre[10005],in[10005];
struct e
{
int a,b;
char ch;
}c[20005];
void init()
{
for(int i=0;i<n;i++)
pre[i]=i;
}
vector<int>top[10005];
int find(int x)
{
while(x!=pre[x])
x=pre[x];
return x;
}
void topsort()
{
queue<int> q;
bool flag=false;
while(!q.empty()) q.pop();
for(int i=0;i<n;i++)
if(pre[i]==i&&in[i]==0) {//把=的情况去掉
q.push(i);
}
while(!q.empty())
{
if(q.size()>1) flag=true;//根据题意,不可能同时延伸两个数,他们之间rating不同,无法根据RP比较
int t=q.front();
q.pop();
sum--;
for(int i=0;i<top[t].size();i++)
{
in[top[t][i]]--;
if(in[top[t][i]]==0)
q.push(top[t][i]);
}
}
if(sum>0) printf("CONFLICT\n");//如果不冲突的话所有的点都会被取消掉
else if(flag) printf("UNCERTAIN\n");
else printf("OK\n");
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(in,0,sizeof in);
for(int i=0;i<n;i++)
top[i].clear();
sum=n;
init();
for(int i=0;i<m;i++)
{
scanf("%d %c %d",&c[i].a,&c[i].ch,&c[i].b);
if(c[i].ch=='=')//利用并查集减少不需要topsort的数据
{
int dx=find(c[i].a);
int dy=find(c[i].b);
if(dx!=dy)
{
pre[dx]=dy;
sum--;
}
}
}
for(int i=0;i<m;i++)
{
int a=find(c[i].a);
int b=find(c[i].b);//这里不能直接用,需要find
char ch=c[i].ch;
if(ch=='>')
{
in[b]++;
top[a].push_back(b);
}
if(ch=='<')
{
in[a]++;
top[b].push_back(a);
}
}
topsort();
}
return 0;
}