HDU 1811 Rank of Tetris

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oidoidoid/article/details/80932640

之前写了没调,今天捏了一个小样例就过了,卒

今天苟完了粗糙的推箱子大作业,太丑陋了,但是认真敲代码的感觉真好

不能再赖床了,要认真学习

是一go并查集+拓扑排序,有俩处理:

1.等于的把他们合并在一起变成一个

2.最后拓扑排序的时候,如果队列里有大于一个元素,说明排列不唯一

题目

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>

using namespace std;
char s[10];
int head[10005];

struct edge{
    int v,next;
}e[20005];
int ind[10005],fa[10005],sum[10005];
int tot;
queue<int>q;

void addedge(int u, int v){
    e[++tot]=(edge){v,head[u]};
    head[u]=tot;
}

int getfa(int x){
    return fa[x]==x?x:fa[x]=getfa(fa[x]);
}

void unit(int x, int y){
    int xx=getfa(x);
    int yy=getfa(y);
    if (xx==yy)return;
    fa[xx]=yy;
    sum[yy]+=sum[xx];
    for (int i=head[xx];i!=-1;i=e[i].next){
        addedge(yy,getfa(e[i].v));
    }
}

int main(){

    int n,m,x,y;
    while (~scanf("%d%d",&n,&m)){

        memset(head,-1,sizeof(head));
        memset(ind,0,sizeof(ind));

        tot=0;
        for (int i=0;i<n;i++){
            fa[i]=i;
            sum[i]=1;
        }

        for (int i=1;i<=m;i++){
            cin>>x>>s>>y;
            if (s[0]=='>') addedge(getfa(x),getfa(y));
            else if (s[0]=='=') unit(x,y);
            else addedge(getfa(y),getfa(x));
        }

        for (int i=0;i<n;i++){
            if (fa[i]!=i) continue;
            for (int j=head[i];j!=-1;j=e[j].next){
                ind[getfa(e[j].v)]++;
            }
        }

/*
        for (int i=0;i<n;i++) cout<<ind[i]<<" ";
        cout<<endl;
        for (int i=0;i<n;i++) cout<<fa[i]<<" ";
        cout<<endl;
        cout<<sum[0]<<endl;
*/
        int qsum=0;

        for (int i=0;i<n;i++){
            if (fa[i]==i&&ind[i]==0) q.push(i);
        }

        int ans=0;
        while(!q.empty()){
            if (q.size()>1) ans=1;
            int u=q.front();
            //cout<<"u="<<u<<"  sum="<<qsum<<endl; 
            q.pop();
            qsum+=sum[u];
            for (int i=head[u];i!=-1;i=e[i].next){
                int v=getfa(e[i].v);
                ind[v]--;
                if (!ind[v]){
              //      cout<<"fa[v]="<<fa[v]<<" v="<<v<<endl;
                    q.push(v);
                }
            }
        }
        if (qsum<n) cout<<"CONFLICT"<<endl;
        else if (ans==1) cout<<"UNCERTAIN"<<endl;
        else cout<<"OK"<<endl;
    }
}


/*


5 4
0 = 1
2 > 1
3 < 1
4 < 1




*/

猜你喜欢

转载自blog.csdn.net/oidoidoid/article/details/80932640