zoukankan      html  css  js  c++  java
  • 种类并查集(洛谷P2024食物链)(扩展域并查集)

    题目描述

    动物王国中有三类动物 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 句话有的是真

    的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

    • 当前的话与前面的某些真的话冲突,就是假话

    • 当前的话中 X 或 Y 比 N 大,就是假话

    • 当前的话表示 X 吃 X,就是假话

    你的任务是根据给定的 N 和 K 句话,输出假话的总数。

    种类并查集感觉就是有很多种分类,然后根据题中描述,将f数组分成几类,每大小为n的区间维护一类;再根据题中所给描述进行判断合并操作。

    以本题为例,题中给出了三种关系:同类,天敌与猎物,就开一个3*n的数组。

    当给出x与y同类时,有两种情况不满足:1.  x的天敌是y         2.  x的猎物是y 

    合并操作:x与y本身是同类,他们的天敌和猎物也是同类。

    当给出x吃y时,有两种情况不满足:1.  x与y是同类         2.  x的天敌是y 

    合并操作:x的猎物是y,y的天敌是x,y的猎物是x的天敌(根据食物链可知)

    然后就交给并查集去搞啦~~

    #include<bits/stdc++.h>
    using namespace std;
    int n,k,f[300005];
    int find(int x)
    {
        if(f[x]==x) return f[x];
        return f[x]=find(f[x]);
    }
    void add(int a,int b)
    {
        int x=find(a),y=find(b);
        f[x]=y;
    }
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=3*n;i++) f[i]=i;
        //分别为 同类、猎物、天敌 
        int op,x,y,ans=0;
        while(k--)
        {
            scanf("%d%d%d",&op,&x,&y);
            if(x>n||y>n) { ans++; continue; }
            if(op==1)//x、y同类 
            {
                
                //x的猎物或天敌是y,就为假 
                if(find(x+n)==find(y)||find(x+2*n)==find(y))
                { ans++; continue; }
                add(x,y);add(x+n,y+n);add(x+n*2,y+n*2);
            }
            else//x吃y 
            {
                if(x==y) { ans++;continue; }
                if(find(x)==find(y)||find(x)==find(y+n))
                //x与y是同类或x是y的猎物 为假 
                { ans++; continue; }
                //x的猎物是y,y的天敌是x,y的猎物是x的天敌
                add(x+n,y);add(y+2*n,x);add(y+n,x+2*n); 
            }
        }
        printf("%d
    ",ans);
    }
  • 相关阅读:
    作为一个前端,可以如何机智地弄坏一台电脑?
    Mysql数据库字符集问题
    代码扫描工具 SonarQube Scanner 配置 & Jenkins 集成
    【C++】统计代码覆盖率(四)
    【Jenkins】各项配置
    python小知识点汇总
    MobaXterm使用
    PHP代码覆盖率
    golang代码覆盖率
    压测工具Locuse的使用
  • 原文地址:https://www.cnblogs.com/mowanying/p/10609116.html
Copyright © 2011-2022 走看看