hdu 1811 经典拓扑排序+并查集

来源:互联网 发布:什么软件卖二手手机 编辑:程序博客网 时间:2024/06/15 17:00
#include<bits/stdc++.h>using namespace std;const int maxn=20005;struct node{int up,down;char cc;}a[maxn];int in[maxn],fa[maxn];vector<int> edge[maxn];int find(int num){    return fa[num]==num?num:fa[num]=find(fa[num]);}int main(){    int n,m,i,j,sum,flag;    char ch;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=flag=0;i<=n;i++)        {            in[i]=0;            fa[i]=i;            edge[i].clear();        }        sum=n;        for(i=0;i<m;i++)        {            scanf("%d ",&a[i].up);            a[i].cc=getchar();            scanf("%d",&a[i].down);            if(a[i].cc=='=')            {                int sa=find(a[i].up),sb=find(a[i].down);                if(sa!=sb)                {                    fa[sa]=sb;                    sum--;                }            }        }        for(i=0;i<m;i++)        {            if(a[i].cc!='=')            {                int sa=find(a[i].up),sb=find(a[i].down);                if(a[i].cc=='>')                {                    edge[sa].push_back(sb);                    in[sb]++;                }                else                {                    in[sa]++;                    edge[sb].push_back(sa);                }            }        }        queue<int> que;        for(i=0;i<n;i++)            if(in[i]==0&&find(i)==i)                que.push(i);        while(que.size())        {            if(que.size()>1)                flag=1;            int now=que.front();            que.pop();            sum--;            for(vector<int>::iterator i=edge[now].begin();i!=edge[now].end();i++)            {                in[*i]--;                if(in[*i]==0)                    que.push(*i);            }        }        if(sum>0)            printf("CONFLICT\n");        else if(flag)            printf("UNCERTAIN\n");        else            printf("OK\n");    }    return 0;}

原创粉丝点击