相等的用并查集处理
剩下的部分就拓扑排序 这里是用队列写的
若所有点都有正确的大小关系顺序 就合法 否则conflict
其次一个点对应多个下一级 就不确定
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll __int64
using namespace std;
int r[10005],num,x[20005],y[20005],in[10005];
char op[20005][3];
vector<int> q[10005];
int root(int a)
{
if(r[a]==a) return a;
r[a]=root(r[a]);
return r[a];
}
void merge(int a,int b)
{
int ra,rb;
ra=root(a);
rb=root(b);
if(ra==rb) return ;
num--;
if(rb>ra)
{
r[ra]=rb;
}
else r[rb]=ra;
}
int main()
{
int n,m,i,tmp;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<=n;i++)
r[i]=i,q[i].clear();
memset(in,0,sizeof in);
num=n;
for(i=0;i<m;i++)
{
scanf("%d %s %d",&x[i],&op[i],&y[i]);
if(op[i][0]=='=') merge(x[i],y[i]);
}
for(i=0;i<m;i++)
{
int xx=root(x[i]);
int yy=root(y[i]);
if(op[i][0]=='>')
{
q[xx].push_back(yy);
in[yy]++;
}
else if(op[i][0]=='<')
{
q[yy].push_back(xx);
in[xx]++;
}
}
queue<int> qq;
for(i=0;i<n;i++)
{
if(!in[i]&&i==root(i))
qq.push(i);
}
int flag=0;
while(!qq.empty())
{
if(qq.size()>1)
flag=1;
int tmp=qq.front();
qq.pop();
num--;
for(i=0;i<q[tmp].size();i++)
{
in[q[tmp][i]]--;
if(in[q[tmp][i]]==0)
qq.push(q[tmp][i]);
}
}
if(num>0) printf("CONFLICT\n");
else if(flag) printf("UNCERTAIN\n");
else printf("OK\n");
}
return 0;
}