#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
int fa[10005],M,N;
int indegree[10005];
int x[20005],y[20005];
char c[20005];
const char *s[]={"OK","UNCERTAIN","CONFLICT"};
int find(int x){
return fa[x]==x?x:find(fa[x]);
}
bool merge(int x,int y){
int fax=find(x);
int fay=find(y);
if(fax==fay)return false;
fa[fax]=fay;
return true;
}
int main(){
int i,j,k,m,n;
xx:while(scanf("%d%d",&N,&M)==2){
vector<int> vt[10005];
queue<int> que;
memset(indegree,0,sizeof(indegree));
for(i=0;i<N;i++)fa[i]=i;
for(i=0;i<M;i++){
scanf("%d",&x[i]);
do{scanf("%c",&c[i]);}while(c[i]==' ');
scanf("%d",&y[i]);
if(c[i]=='=')merge(x[i],y[i]);
}
for(i=0;i<M;i++){
if(c[i]=='=')continue;
int fax=find(x[i]);
int fay=find(y[i]);
if(fax==fay){
printf("CONFLICT\n");
goto xx;
}
if(c[i]=='<'){
indegree[fay]++;
vt[fax].push_back(fay);
}
else {
indegree[fax]++;
vt[fay].push_back(fax);
}
}
for(i=0;i<N;i++){
if(fa[i]==i){
if(indegree[i]==0) que.push(i);
}
}
int sign=0;
while(!que.empty()){
if(que.size()>1){
sign=1;
}
int t=que.front();
que.pop();
for(vector<int>::iterator it=vt[t].begin();it!=vt[t].end();it++)if(--indegree[*it]==0) que.push(*it);
}
for(i=0;i<N;i++){
if(indegree[i]!=0)sign=2;
}
printf("%s\n",s[sign]);
}
return 0;
}
hdu1881
最新推荐文章于 2017-11-22 13:48:00 发布