题目要求 当冲突和多解并存时 要判为冲突 所以不能发现多解就停止..
#include <bits/stdc++.h>
using namespace std;
struct node1
{
int u;
int v;
char ch[2];
};
struct node2
{
int v;
int next;
};
queue <int> que;
node1 order[20010];
node2 edge[20010];
int first[10010],f[10010],degree[10010];
int n,m,num;
void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
return;
}
int getf(int p)
{
if(f[p]==p) return p;
else
{
f[p]=getf(f[p]);
return f[p];
}
}
void unite(int u,int v)
{
int fu,fv;
fu=getf(u);
fv=getf(v);
if(fu!=fv) f[fv]=fu;
return;
}
int main()
{
int i,j,flag,sum,cnt,u,v,fu,fv;
while(scanf("%d%d",&n,&m)!=EOF)
{
while(!que.empty()) que.pop();
for(i=1;i<=n;i++)
{
first[i]=-1;
f[i]=i;
degree[i]=0;
}
num=0,sum=n;
for(i=1,j=0;i<=m;i++)
{
scanf("%d%s%d",&order[i].u,order[i].ch,&order[i].v);
order[i].u++,order[i].v++;
if(order[i].ch[0]=='=') unite(order[i].u,order[i].v);
else order[++j]=order[i];
}
m=j;
for(i=1;i<=m;i++)
{
if(order[i].ch[0]=='>')
{
fu=getf(order[i].u);
fv=getf(order[i].v);
addedge(fu,fv);
degree[fv]++;
}
else
{
fu=getf(order[i].u);
fv=getf(order[i].v);
addedge(fv,fu);
degree[fu]++;
}
}
sum=0,cnt=0;
for(i=1;i<=n;i++)
{
if(f[i]==i)
{
if(degree[i]==0)
{
que.push(i);
cnt++;
}
sum++;
}
}
if(cnt>1) flag=0;
else flag=1;
while(!que.empty())
{
u=que.front();
que.pop();
sum--,cnt=0;
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
degree[v]--;
if(degree[v]==0)
{
que.push(v);
cnt++;
}
}
if(cnt>1) flag=0;
}
if(sum>0) printf("CONFLICT\n");
else if(flag) printf("OK\n");
else printf("UNCERTAIN\n");
}
return 0;
}