#include<bits/stdc++.h>
using namespace std;
const int maxn=20005;
struct node{int up,down;char cc;}a[maxn];
int in[maxn],fa[maxn];
vector<int> edge[maxn];
int find(int num)
{
return fa[num]==num?num:fa[num]=find(fa[num]);
}
int main()
{
int n,m,i,j,sum,flag;
char ch;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=flag=0;i<=n;i++)
{
in[i]=0;
fa[i]=i;
edge[i].clear();
}
sum=n;
for(i=0;i<m;i++)
{
scanf("%d ",&a[i].up);
a[i].cc=getchar();
scanf("%d",&a[i].down);
if(a[i].cc=='=')
{
int sa=find(a[i].up),sb=find(a[i].down);
if(sa!=sb)
{
fa[sa]=sb;
sum--;
}
}
}
for(i=0;i<m;i++)
{
if(a[i].cc!='=')
{
int sa=find(a[i].up),sb=find(a[i].down);
if(a[i].cc=='>')
{
edge[sa].push_back(sb);
in[sb]++;
}
else
{
in[sa]++;
edge[sb].push_back(sa);
}
}
}
queue<int> que;
for(i=0;i<n;i++)
if(in[i]==0&&find(i)==i)
que.push(i);
while(que.size())
{
if(que.size()>1)
flag=1;
int now=que.front();
que.pop();
sum--;
for(vector<int>::iterator i=edge[now].begin();i!=edge[now].end();i++)
{
in[*i]--;
if(in[*i]==0)
que.push(*i);
}
}
if(sum>0)
printf("CONFLICT\n");
else if(flag)
printf("UNCERTAIN\n");
else
printf("OK\n");
}
return 0;
}
hdu 1811 经典拓扑排序+并查集
最新推荐文章于 2020-10-17 10:30:07 发布