hdu-1811 Rank of Tetris

来源:互联网 发布:阿里云静态网站搭建 编辑:程序博客网 时间:2024/05/09 14:23

http://acm.hdu.edu.cn/showproblem.php?pid=1811

题意很简单,关键在于处理‘=’的 情况,如果两个人的rating相等的话,其实可以看成一个人,那么这就用到了并查集来合并。

然后信息不完全或者冲突的情况可以做一遍拓扑排序的过程,初始sum=n,然后如果排序完了还是sum>0 就表示构成了环,所以导致冲突。

用一个标志位表示如果队列的size>1 那么肯定信息不完全,因为首先加入队列里面的就是入度为0,并且不是同一个祖先的点,如果有多个点满足,那么肯定这些点彼此之间的关系无法判断。具体看代码。

#include<cstdio>#include<vector>#include<queue>#include<cstring>#define N 10001#define maxn 20001using namespace std;int f[N],in[N],n,sum;int x[maxn],y[maxn];char z[maxn];vector<int>num[N];void init(){    sum=n;    for(int i=0;i<n;i++)    {        in[i]=0;        f[i]=i;        num[i].clear();    }}int find(int x){    if(x==f[x]) return x;    f[x]=find(f[x]);    return f[x];}int Union(int x,int y){    int a=find(x);    int b=find(y);    if(a==b) return 0;    f[b]=a;    return 1;}void top_sort(){    queue<int>q;    int flag=0;    for(int i=0;i<n;i++)        if(in[i]==0&&f[i]==i)        q.push(i);    while(!q.empty())    {        if(q.size()>1) flag=1;        int x=q.front();        q.pop();        sum--;        for(int i=0;i<num[x].size();i++)        {            in[num[x][i]]--;            if(in[num[x][i]]==0)                q.push(num[x][i]);        }    }    if(sum>0) printf("CONFLICT\n");    else if(flag) printf("UNCERTAIN\n");    else printf("OK\n");}int main(){    //freopen("a.txt","r",stdin);    int m;    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        for(int i=0;i<m;i++)        {            scanf("%d %c %d",&x[i],&z[i],&y[i]);            if(z[i]=='=')            {               if(Union(x[i],y[i]))                sum--;            }        }        for(int i=0;i<m;i++)        {            if(z[i]!='=')            {                int fx=find(x[i]);                int fy=find(y[i]);                if(z[i]=='>')                {                    num[fx].push_back(fy);                    in[fy]++;                }                else                {                    num[fy].push_back(fx);                    in[fx]++;                }            }        }        top_sort();    }    return 0;}


 

0 0
原创粉丝点击