思路:
先把‘=’的数合并成一个,然后拓扑排序,如果拓扑过程中可选择点的数量超过一个,则信息不完全。
如果有环,说明冲突,那么num就不会到0.
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
int n,m,fa[maxn],X[maxn * 2],Y[maxn * 2];
int in[maxn];
char op[maxn * 2];
vector<int> G[maxn];
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
bool join(int x,int y)
{
int a=find(x), b=find(y);
if(a==b)
{
return false;
}
fa[b]= a;
return true;
}
void init(int n)
{
for(int i = 0; i <= n; i++)
fa[i] = i;
for(int i = 0; i<= n; i++)
G[i].clear();
memset(in,0,sizeof in);
}
int main()
{
while(cin>>n>>m)
{
int num = n;
init(n);
for(int i = 0 ; i < m ; i++)
{
cin>>X[i]>>op[i]>>Y[i];
if(op[i]=='=')
{
if(join(X[i],Y[i]))
num--;
}
}
for(int i = 0; i < m; i++)
{
int x= find(X[i]);
int y = find(Y[i]);
if(op[i] == '>')
{
G[x].push_back(y);
in[y]++;
}
else if(op[i] == '<')
{
G[y].push_back(x);
in[x]++;
}
}
queue<int>que;
for(int i= 0; i< n; i++)
{
if(in[i] ==0 &&i == find(i))
{
que.push(i);
}
}
int flag = 1;
while(!que.empty())
{
if(que.size() > 1)
flag = 0;
int t = que.front();
que.pop();
num--;
for(int i = 0; i < G[t].size(); i++)
{
if(--in[G[t][i]] == 0)
{
que.push(G[t][i]);
}
}
}
if(num > 0)
{
cout<<"CONFLICT"<<endl;
}
else if(flag == 0)
{
cout<<"UNCERTAIN"<<endl;
}
else
{
cout<<"OK"<<endl;
}
}
return 0;
}