• hdu 1811 Rank of Tetris 拓扑排序+并查集


    输入中有等效的点,所以要将他们全部删除。所以只有在所以数据全部输入完成后才可以建边的关系。
    输出有三种可能,分别对应下面三种情况。
    - 成功
    - 成环,就是最后点的个数小于输入的点的个数,这个是信息冲突的原因
    - 同时有两个点入度为零进入队列,信息不完全

    #include "stdio.h"
    #include "string.h"
    #include "stack"
    #include "queue"
    #include "vector"
    #include "algorithm"
    using namespace std;
    const int N=10000+5;
    
    int n,m,bin[N],in[N];
    vector<int>t[N];
    queue<int>q;
    
    int Find(int x)
    {
        if(bin[x]==x) return x;
        else return Find(bin[x]);
    }
    
    int main()
    {
        int i,j,f,a[N],b[N],cnt,fa,fb,k;
        char s[N][5];
        while(~scanf("%d%d",&n,&m))
        {
    
            for(i=0;i<n;i++)
            {
                bin[i]=i;
                in[i]=0;
                t[i].clear();
            }
            memset(s,0,sizeof(s));
            while(!q.empty()) q.pop();
            cnt=0;
            f=1;
            for(i=0;i<m;i++)
            {
                scanf("%d %s %d",&a[i],s[i],&b[i]);
                if(s[i][0]=='=')
                {
                    fa=Find(a[i]);
                    fb=Find(b[i]);
                    if(fa!=fb)
                        bin[fa]=fb;
                    cnt++;
                }
            }
    
            for(i=0;i<m;i++)
            {
                if(strcmp(s[i],"=")==0) continue;
                else if(strcmp(s[i],">")==0)
                {
                    fa=Find(a[i]);
                    fb=Find(b[i]);
                    if(fa==fb) {f=0; break;}
                    t[fa].push_back(fb);
                    in[fb]++;
                }
                else if(strcmp(s[i],"<")==0)
                {
                    fa=Find(a[i]);
                    fb=Find(b[i]);
                    if(fa==fb) {f=0; break;}
                    t[fb].push_back(fa);
                    in[fa]++;
                }
            }
    
            if(f==0) {printf("CONFLICT
    ");continue;}
    
            for(i=0;i<n;i++)
            {
                if(in[i]==0&&Find(i)==i)
                {
                    q.push(i);
                    cnt++;
                }
            }
    
            while(!q.empty())
            {
                if(q.size()>=2) f=0;
                k=q.front();
                q.pop();
                for(i=0;i<t[k].size();i++)
                {
                    in[t[k][i]]--;
                    if(in[t[k][i]]==0)
                    {
                        q.push(t[k][i]);
                        cnt++;
                    }
                }
            }
    
            if(cnt<n) printf("CONFLICT
    ");
            else if(f==0) printf("UNCERTAIN
    ");
            else printf("OK
    ");
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    Flask-1-03-HelloWorld
    Flask-1-02-安装环境
    Flask-1-01-初识Flask
    Ubuntu解决virtualbox 安装增强包的报错
    ubuntu安装软件has install-snap change in progress错误
    virtualbox
    Nginx 403 Forbidden错误的解决方法
    处理Redis报错:redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snap
    在Ubuntu18.04上安装MySQL
    Python3 错误、调试和测试
  • 原文地址:https://www.cnblogs.com/xryz/p/4847874.html
Copyright © 2020-2023  润新知