POJ1182 食物链(并查集)

题目展示

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

第一行是两个整数N和K,以一个空格分隔。
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。
若D=1,则表示X和Y是同类。
若D=2,则表示X吃Y。

Output

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

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

Source

《算法竞赛进阶指南》, 模板题 , NOI2001 , POJ1182 , kuangbin专题

题解

题目中只有三类动物A,B,C,可以分为三类动物:0类动物、1类动物、2类动物(对3取模)。1类动物吃0类动物,2类动物吃1类动物,0类动物吃2类动物,构成环形。按照数学同余的概念,当为第一种说法时,有d[x] \equiv d[y]\ (mod \ 3);当为第二种说法时,有d[x] \equiv d[y] + 1\ (mod \ 3)

代码

#include <iostream>

using namespace std;

const int N = 50010;

int n, m;
int p[N], d[N];

int find(int x)
{
    if (p[x] != x)
    {
        int t = find(p[x]);
        d[x] += d[p[x]];
        p[x] = t;
    }
    return p[x];
}

int main()
{
    scanf("%d%d", &n, &m);
    
    for (int i = 1; i <= n; i++) p[i] = i;
    
    int res = 0;
    while (m--)
    {
        int t, x, y;
        scanf("%d%d%d", &t, &x, &y);
        
        if (x > n || y > n) res++;
        else
        {
            int px = find(x), py = find(y);
            if (t == 1)
            {
                if (px == py && (d[x] - d[y]) % 3) res++;
                else if (px != py)
                {
                    p[px] = py;
                    d[px] = d[y] - d[x];  // (d[x] + ? - d[y]) % 3 == 0
                }
            }
            else
            {
                if (px == py && (d[x] - d[y] - 1) % 3) res++;
                else if (px != py)
                {
                    p[px] = py;
                    d[px] = d[y] - d[x] + 1;  // (d[x] + ? - d[y] - 1) % 3 == 0
                }
            }
        }
    }
    
    printf("%d\n", res);
    
    return 0;
}

相关推荐

  1. :240. 食物链

    2023-12-10 14:24:04       24 阅读
  2. P2024 [NOI2001] 食物链 带权(种类)整理

    2023-12-10 14:24:04       40 阅读
  3. 【C++】

    2023-12-10 14:24:04       27 阅读
  4. 笔记

    2023-12-10 14:24:04       22 阅读
  5. <span style='color:red;'>并</span><span style='color:red;'>查</span><span style='color:red;'>集</span>

    2023-12-10 14:24:04      14 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 14:24:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 14:24:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 14:24:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 14:24:04       18 阅读

热门阅读

  1. Django大回顾 - 9 Auth模块的使用、缓存

    2023-12-10 14:24:04       38 阅读
  2. tomcat安全基线检查

    2023-12-10 14:24:04       36 阅读
  3. 单例模式【C#】

    2023-12-10 14:24:04       36 阅读
  4. LINQ【C#】

    2023-12-10 14:24:04       32 阅读
  5. C#.net使用npgsql批量写入数据入库到postgresql数据库

    2023-12-10 14:24:04       34 阅读
  6. pytorch 笔记:dist 和 cdist

    2023-12-10 14:24:04       36 阅读
  7. C语言中getchar函数

    2023-12-10 14:24:04       37 阅读
  8. Codeforces Round 912 (Div. 2)补题

    2023-12-10 14:24:04       36 阅读
  9. paddle detection 怎么解析配置文件

    2023-12-10 14:24:04       29 阅读