HDU

来源:互联网 发布:炫浪网络社区百合 编辑:程序博客网 时间:2024/06/05 20:53

题解:将相等的点并到一个集合里面,然后拓扑排序如果存在环就是矛盾,如果一个队列里面存在多个数就是,不确定,其他都是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;}
原创粉丝点击