hdu 1811 拓扑排序+并查集

来源:互联网 发布:海康威视网络球机接线 编辑:程序博客网 时间:2024/05/21 09:53
#include"stdio.h"#include"string.h"#include"vector"#include"queue"#include"algorithm"using namespace std;int pre[30000],degree[30000];vector<int>vet[30000];int sum,n,m;struct point{    int x,y;    char ch;}a[30000];int find(int k){    if(k!=pre[k])        pre[k]=find(pre[k]);    return pre[k];}void Union(int x,int y){    x=find(x);    y=find(y);    if(x!=y)        pre[y]=x;}void fun(){    int i;    for(i=0;i<n;i++)    {        pre[i]=i;        degree[i]=0;        vet[i].clear();    }}int top(){    int i,ss=0;    queue<int>q;    for(i=0;i<n;i++)    {        if(find(i)==i&&degree[i]==0)            q.push(i);    }    while(!q.empty())    {        if(q.size()>=2)            ss=-1;        int x=q.front();        q.pop();        sum--;        for(i=0;i<vet[x].size();i++)        {            if(degree[vet[x][i]]>0)                degree[vet[x][i]]--;            if(degree[vet[x][i]]==0)                q.push(vet[x][i]);        }    }    if(sum>=1)        return 1;    return ss;}int main(){    int i,flag1,flag2,x,y;    while(scanf("%d%d",&n,&m)!=EOF)    {        fun();        sum=n;        flag1=0;flag2=0;        for    (i=0;i<m;i++)            scanf("%d %c %d",&a[i].x,&a[i].ch,&a[i].y);            for(i=0;i<m;i++)        {            if(a[i].ch=='=')            {                Union(a[i].x,a[i].y);                sum--;            }        }        for(i=0;i<m;i++)        {            if(a[i].ch=='=')                continue;            x=find(a[i].x);            y=find(a[i].y);            if(x==y)            {                flag1=1;            }            if(a[i].ch=='>')            {                vet[x].push_back(y);                degree[y]++;            }            else             {                vet[y].push_back(x);                degree[x]++;            }        }        if(!flag1)        {            int tem=top();            if(tem==1)                flag1=1;            else if(tem==-1)                flag2=1;        }        if(flag1==1)            printf("CONFLICT\n");        else if(flag2==1)            printf("UNCERTAIN\n");        else printf("OK\n");    }    return 0;}
原创粉丝点击