• CODEVS_1074 食物链


    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #define MAX_N 50004
    using namespace std;
    
    int father[3*MAX_N];
    int N,K;
    int ans=0;
    void init()
    {
        for(int i=1;i<=3*N;i++)
            father[i]=i;
    }
    
    int Find(int x)
    {
        if(x==father[x])return x;
        else return father[x]=Find(father[x]);
    }
    
    void Union(int x,int y)
    {
        int u=Find(x),v=Find(y);
        if(u==v)
            return;
        father[u]=v;
    }
    
    int main()
    {
        cin>>N>>K;
        init();
        for(int i=0;i<K;i++)
        {
            int d,x,y;
            cin>>d>>x>>y;
            if(x>N||y>N||(d==2&&x==y))
            {
                ans++;
                continue;
            }
            bool flag=1;
    
            int u[3],v[3];
            for(int j=0;j<3;j++)
                u[j]=Find(x+j*N),v[j]=Find(y+j*N);
            if(d==1)
            {
                for(int j=0;j<3&&flag;j++)
                    for(int k=0;k<3;k++)
                        if(j!=k&&u[j]==v[k])
                        {
                            ans++;
                            flag=false;
                            break;
                        }
                if(!flag)continue;
                for(int j=0;j<3;j++)
                    Union(x+j*N,y+j*N);
            }
            if(d==2)
            {
                for(int j=0;j<3&&flag;j++)
                    for(int k=0;k<3;k++)
                        if((j+1)%3!=k&&u[j]==v[k])
                        {
                            ans++;
                            flag=false;
                            break;
                        }
                if(!flag)continue;
                for(int j=0;j<3;j++)
                    Union(x+j*N,y+((j+1)%3)*N);
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    

    原题链接:http://codevs.cn/problem/1074/

    题目描述 Description

    动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。   

    现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。   

    有人用两种说法对这N个动物所构成的食物链关系进行描述:   

    第一种说法是“1 X Y”,表示X和Y是同类。   

    第二种说法是“2 X Y”,表示X吃Y。   

    此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。   

    1) 当前的话与前面的某些真的话冲突,就是假话;   

    2) 当前的话中X或Y比N大,就是假话;   

    3) 当前的话表示X吃X,就是假话。   

    你的任务是根据给定的N(1<=N<=50,000)和K句话(0<=K<=100,000),输出假话的总数。

    输入描述 Input Description

    第一行是两个整数N和K,以一个空格分隔。   

    以下K行每行是三个正整数D,X,Y,两数之间用一个空格隔开,其中 D 表示说法的种类。   

    若D=1,则表示X和Y是同类。   

    若D=2,则表示X吃Y。

    输出描述 Output Description

    只有一个整数,表示假话的数目。

    样例输入 Sample Input

    100 7

    1 101 1

    2 1 2

    2 2 3

    2 3 3

    1 1 3

    2 3 1

    1 5 5

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    输入文件  

     对7句话的分析 100 7

    1 101 1  假话

    2 1 2    真话

    2 2 3    真话

    2 3 3    假话

    1 1 3    假话

    2 3 1    真话

     1 5 5    真话

    NOI 2001 食物链(eat)

    这道题的关键在于建立命题,比如告诉1吃2,那么我们能够得到以下的命题,1是A的话2是B,1是B的话2是C,1是C的话2是A,那么我们就可以用并查集将1A(表示1是A)和2B合并,以此类推。同理,如果得到的是1和2是同类,那么就将1A和2A合并,1B和2B合并,1C和2C合并。假如在合并1A和2A的时候,发现1A和2B或者2C属于同一个集合,那么,说明这句话就是假话,其余同理。

    详见代码:


  • 相关阅读:
    JWT验证
    SQLite报错: no such column:StamoRule(表名)
    .Net Core 程序报错 在上一个操作完成之前,在此上下文上启动了第二个操作。
    接口请求报错 504 Gateway Time-out
    未处理的异常:system.io.file load exception:无法加载文件或程序集“ 。。。。 找到的程序集的清单定义与程序集引用不匹配。
    好多年没回到这个园子
    模拟webpack 实现自己的打包工具
    微信小程序迁移到头条小程序工具
    手机端图片懒加载
    react系列一,react虚拟dom如何转成真实的dom
  • 原文地址:https://www.cnblogs.com/HarryGuo2012/p/4524047.html
Copyright © 2020-2023  润新知