现在的位置: 首页 > 综合 > 正文

hdu 1811 Rank of Tetris

2018年12月29日 ⁄ 综合 ⁄ 共 1118字 ⁄ 字号 评论关闭

拓扑排序,加入了a=b;

将等于的多个点用并差集缩成一个点

 

 

 

#include<stdio.h>
#include<stack>
using namespace std;
int n,nm;
struct op
{
    int son;
    struct op *next;
}*p[10005];
int link[10005],ls[20005],ld[20005],f[10005];
int find(int a)
{
    if(a!=f[a])
        f[a]=find(f[a]);
    return f[a];
}
void insert(int a,int b)
{
    op *q=new op;
    q->son=b;
    q->next=p[a];
    p[a]=q;
}
int tuopusort()
{
    int flag=0,num=0;;
    stack<int>Q;
    for(int i=0;i<n;i++)
        if(link[i]==0&&find(i)==i)
            Q.push(i);
        while(!Q.empty())
        {
            if(Q.size()>1)flag=1;
            num++;
            int u=Q.top();
            Q.pop();
            for(op *j=p[u];j;j=j->next)
            {
                if(--link[j->son]==0)
                    Q.push(j->son);
            }
        }
        if(num!=nm)return 1;
        else if(flag==1)return 2;
        else       return 3;            
}
int main()
{
    int i,m,x,y;
    char ch[20005];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        nm=n;
        for(i=0;i<n;i++)
        {
            p[i]=NULL;
            f[i]=i;
            link[i]=0;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d %c %d",&ls[i],&ch[i],&ld[i]);
            if(ch[i]=='=')
            {
                x=find(ls[i]);y=find(ld[i]);
                if(x!=y)
                {
                    f[x]=y;nm--;
                }
            }
        }
        int flag=1;
        for(i=0;i<m;i++)
        {
            if(ch[i]=='=')continue;
            x=find(ls[i]);y=find(ld[i]);
            if(x==y){flag=0;break;}
            if(ch[i]=='>')
            {
                insert(x,y);
                link[y]++;
            }
            else 
            {
                insert(y,x);
                link[x]++;
            }
        }
        if(flag==0){puts("CONFLICT");continue;}
        int j=tuopusort();
              if(j==1)puts("CONFLICT");
            else if(j==2)puts("UNCERTAIN");
            else puts("OK");
    }
    return 0;
}

 

抱歉!评论已关闭.