/*
hdu1811 并查集 拓扑排序
Author:lcy
Time:2017-10-19
给出一组大于小于等于关系,判断其是否合法、矛盾或信息不足
如果只有大小关系,很容易想到拓扑排序来处理。
现在多了等于关系,那么可以先用并查集将所有相等的数合并,
再用拓扑排序即可。
注意如果矛盾和信息不足同时出现,输出矛盾。在这里WA了好久。
*/
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
#define idx(a) (a-'a')
using namespace std;
const int MAXN=10005;
const int MAXM=20005;
int fa[MAXN],e[MAXM],in[MAXN],sz;
int fir[MAXM],sec[MAXM],ed;
vector<int>g[MAXN];
int n,m;
void add_edge(int f,int t){
    in[t]++;
    g[f].pb(sz);
    e[sz++]=t;
}
int find_fa(int x){ 
    return fa[x]==x?x:find_fa(fa[x]);
}
void uni(int x,int y){
    int fax=find_fa(x);
    int fay=find_fa(y);
    fa[fax]=fay;
}
inline void solve(){
    int a,b;char c;
    fr(i,1,m){
        scfd(&a);
        scanf(" %c",&c);
        scfd(&b);
        switch(c){
            case '=':
                uni(a,b);
                break;
            case '>':
                fir[ed]=a,sec[ed]=b;
                ed++;
                break;
            case '<':
                fir[ed]=b,sec[ed]=a;
                ed++;
                break;
        }
    }
    fr(i,0,ed-1)
        add_edge(find_fa(fir[i]),find_fa(sec[i]));
    int left=0;
    fr(i,0,n-1)
        if(find_fa(i)==i)
            left++;
    queue<int>q;
    int cnt=0;
    fr(i,0,n-1)
        if(find_fa(i)==i&&!in[find_fa(i)]){
            q.push(fa[i]);
            cnt++;
        }

    bool f=false;
    if(cnt>1)
        f=true;
    while(!q.empty()){
        cnt=0;
        int now=q.front();q.pop();
        left--;
        int size=g[now].size();
        fr(i,0,size-1){
            in[e[g[now][i]]]--;
            if(!in[e[g[now][i]]]){
                cnt++;
                q.push(e[g[now][i]]);
            }
        }
        if(cnt>1)
            f=true;
    }
    if(left)
        puts("CONFLICT");
    else if(f)
        puts("UNCERTAIN");
    else 
        puts("OK");    
}
inline void init(){
    fr(i,0,n){g[i].clear(),fa[i]=i,in[i]=0;}
    ed=sz=0;
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        init();
        solve();
    }
    return 0;
}
 posted on 2017-10-19 23:57  cylcy  阅读(85)  评论(0编辑  收藏  举报