http://acm.hdu.edu.cn/showproblem.php?pid=1811
题意: 题面意思
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#define maxs 101010
#include <vector>
#define MME(i,j) memset(i,j,sizeof(i))
using namespace std;
int fa[maxs],ranks[maxs],x[maxs],y[maxs];
vector <int> group[10005];
int son[maxs];
void init(int n)
{
for(int i=0;i<=n;i++)
{
fa[i]=i,ranks[i]=0;
group[i].clear();
}
MME(son,0);
}
int find_fa(int x)
{
if(x==fa[x])
return x;
return fa[x]=find_fa(fa[x]);
}
bool joint(int x,int y)
{
int a=find_fa(x),b=find_fa(y);
if(a==b)
return 0;
if(ranks[a]>ranks[b])
fa[b]=a;
else{
if(ranks[a]==ranks[b])
ranks[b]++;
fa[a]=b;
}
return 1;
}
char s[20000];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
init(n);
int cnt=n;
for(int i=0;i<m;i++)
{
scanf("%d %c %d",&x[i],&s[i],&y[i]);
if(s[i]=='=')
{
if(joint(x[i],y[i]))
cnt--;
}
}
int rx,ry;
for(int i=0;i<m;i++)
{
if(s[i]!='=')
{
rx=find_fa(x[i]),ry=find_fa(y[i]);
if(s[i]=='>')
{
group[rx].push_back(ry);
son[ry]++;
}
else{
group[ry].push_back(rx);
son[rx]++;
}
}
}
queue<int>q;
for(int i=0;i<n;i++){
if(son[i]==0 && i==find_fa(i))
q.push(i);
}
bool fg=0;
while(!q.empty())
{
if(q.size()>1) fg=1;
int t=q.front();
q.pop();
cnt--;
int sz=group[t].size();
for(int i=0;i<sz;i++)
{
if(--son[group[t][i]]==0)
q.push(group[t][i]);
}
}
if(cnt>0)
printf("CONFLICT\n");
else if(fg)
printf("UNCERTAIN\n");
else
printf("OK\n");
}
return 0;
}