题解:将相等的点并到一个集合里面,然后拓扑排序如果存在环就是矛盾,如果一个队列里面存在多个数就是,不确定,其他都是OK
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int mx = 1e4+5;
struct node{
int v;
int next;
}E[mx<<2];
int head[mx];
int in[mx];
int tot;
int vis[mx];
int p[mx];
queue<int>q;
vector<int>g[mx];
void add(int u,int v){
tot++;
E[tot].v = v;
E[tot].next = head[u];
head[u] = tot;
}
int find(int x){
return p[x] == x?x:p[x] = find(p[x]);
}
int main(){
int a,b;
char c;
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
tot = 0;
for(int i = 0; i < n; i++){
p[i] = i;
g[i].clear();
}
int sum = n;
for(int i = 1; i <= m; i++){
scanf("%d %c %d",&a,&c,&b);
if(c=='<')
add(b,a);
else if(c=='>')
add(a,b);
else {
a = find(a);
b = find(b);
if(a!=b){
p[b] = a;
sum--;
}
}
}
for(int i = 0; i < n; i++){
int x = find(i);
for(int j = head[i]; j; j = E[j].next){
int v = find(E[j].v);
g[x].push_back(v);
in[v]++;
}
}
int cnt = 0;
int ok = 1;
for(int u = 0; u < n; u++)
if(!in[find(u)]){
if(!vis[find(u)]){
q.push(find(u));
cnt++;
vis[find(u)] = 1;
}
}
while(!q.empty()){
int u = q.front();
q.pop();
if(!q.empty())
ok = 0;
for(auto v: g[u]){
in[v]--;
if(!in[v]){
cnt++;
q.push(v);
}
}
}
//cout<<cnt<<endl;
//cout<<sum<<endl;
if(cnt!=sum)
puts("CONFLICT");
else if(ok == 0)
puts("UNCERTAIN");
else
puts("OK");
}
return 0;
}