解题思路:相等的要用并查集缩点,然后再拓扑排序一下就行。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
const int mx = 1e4+5,mod = 1e9+7;
int n,m,in[mx],fa[mx],size;
typedef long long ll;
char c;
vector <int> vec[mx];
int find(int x){
return fa[x]==x? x:fa[x]=find(fa[x]);
}
struct node{
int x,y;
char c;
}s[mx<<1];
void topo(){
queue<int>que;
int flag = -1,ans = 1;
for(int i=0;i<n;i++){
if(i!=find(i)||in[i]) continue;
que.push(i);
flag++;
size--;
}
if(flag>0) ans = 0;
while(!que.empty()){
int po = que.front(),cnt = 0;
que.pop();
for(int i=0;i<vec[po].size();i++){
int son = vec[po][i];
in[son]--;
if(!in[son]){
que.push(son);
size--,cnt++;
}
}
if(cnt>1) ans = 0;
}
if(size) puts("CONFLICT");
else if(ans) puts("OK");
else puts("UNCERTAIN");
}
int main(){
while(~scanf("%d%d",&n,&m)){
int ans = 0,a ,b , flag = 0;
memset(in,0,sizeof(in));
size = n;
for(int i=0;i<n;i++) vec[i].clear(),fa[i] = i;
for(int i=1;i<=m;i++){
scanf("%d %c %d",&s[i].x,&s[i].c,&s[i].y);
if(s[i].c=='='){
int x = find(s[i].x);
int y = find(s[i].y);
fa[x] = y;
if(x!=y) size--;
}
}
for(int i=1;i<=m;i++){
int x = find(s[i].x);
int y = find(s[i].y);
if(s[i].c=='<') vec[y].push_back(x),in[x]++;
else if(s[i].c=='>')vec[x].push_back(y),in[y]++;
}
topo();
}
return 0;
}