link
题意:
首先看到排名自然想到拓扑序,但是存在等于的情况,这就启发我们把等于的情况缩成一个点,让后在缩点后的图中进行拓扑即可。
对于不合法的情况当然是拓扑序没有遍历到应该遍历的点,所以只需要检查遍历了几个点即可。对于信息不全的情况,那就是对应同一级存在多个点,所以只需要判断队列是否恒为一个元素即可(当然这种说法不严谨)。
最后如果用并查集缩点的话,一定要注意判断 i == find(i) ,因为缩完点之后这个点就是这个集合的代表。
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=100010,M=N*2,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int e[M],ne[M],h[N],idx;
int p[N],tot;
int d[N];
bool st[N];
struct Query
{int a,b;char op;
}q[N];void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}int find(int x)
{return x==p[x]? x:p[x]=find(p[x]);
}int topsort()
{int sum=0,s=0;int f1,f2; f1=f2=0;queue<int>q;for(int i=0;i<n;i++) if(!d[i]&&i==find(i)) q.push(i),s++; else if(i==find(i)) s++;if(q.size()>1) f1=1;while(q.size()){int cnt=0; sum++;int u=q.front(); q.pop();for(int i=h[u];~i;i=ne[i]){int j=e[i];if(--d[j]==0) q.push(j),cnt++;}if(cnt>1) f1=1;}if(sum!=s) f2=1;if(f1&&f2) return 2;else if(f2) return 2;else if(f1) return 1;else return 0;
}int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);while(scanf("%d%d",&n,&m)!=EOF){idx=0; tot=0;for(int i=0;i<n;i++) p[i]=i,h[i]=-1,d[i]=0,st[i]=0;for(int i=1;i<=m;i++){int a,b; char op[2];scanf("%d%s%d",&a,op,&b);if(*op=='=') p[find(a)]=find(b);else q[++tot]={a,b,op[0]};}for(int i=1;i<=tot;i++){int a=q[i].a,b=q[i].b;st[a]=1; st[b]=1;char op=q[i].op;a=find(a); b=find(b);if(op=='>') d[a]++,add(b,a);else d[b]++,add(a,b);}int t=topsort();if(t==2) puts("CONFLICT");else if(t==1) puts("UNCERTAIN");else puts("OK");}return 0;
}
/**/