#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N=20010;
int n,m;
int fa[N],in[N];
vector<int> q[N];
int a[N],b[N];
char cmd[N][2];
int _find(int x)
{
if(fa[x]!=x)
fa[x]=_find(fa[x]);
return fa[x];
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int f1=0,f2=0;
for(int i=0;i<=n;i++)
{
in[i]=0;
fa[i]=i;
q[i].clear();
}
int tmp=n;
for(int i=0;i<m;i++)
{
scanf("%d %s %d",&a[i],cmd[i],&b[i]);
if(cmd[i][0]=='=')
{
tmp--;
int aa=_find(a[i]),bb=_find(b[i]);
if(aa!=bb) fa[aa]=bb;
}
}
for(int i=0;i<m;i++)
{
if(cmd[i][0]=='=') continue;
int aa=_find(a[i]),bb=_find(b[i]);
if(bb==aa) {f1=1;break;}
if(cmd[i][0]=='<')
{
q[aa].push_back(bb);
in[bb]++;
}
else
{
q[bb].push_back(aa);
in[aa]++;
}
}
if(f1) {puts("CONFLICT");continue;}
queue<int> que;
for(int i=0;i<n;i++)
if(in[i]==0&&_find(i)==i)
que.push(i);
while(!que.empty())
{
int cur=que.front();
que.pop();
tmp--;
if(!que.empty()) f2=1;
for(int i=0;i<q[cur].size();i++)
{
in[q[cur][i]]--;
if(in[q[cur][i]]==0)
que.push(q[cur][i]);
}
}
if(f1||tmp>0) puts("CONFLICT");
else if(f2) puts("UNCERTAIN");
else puts("OK");
}
}
并查集&拓扑排序 (hdu1811)
最新推荐文章于 2022-05-08 22:24:36 发布