P2024 [NOI2001] 食物链 题解

文章介绍了P2024[NOI2001]食物链问题的解决方法,主要利用并查集数据结构,通过三个并查集分别存储生物、猎物和天敌的关系。在处理食物链关系时,对并查集进行连接和查询操作,同时提供了AC代码示例进行详细解释。
摘要由CSDN通过智能技术生成

P2024 [NOI2001] 食物链 题解



前言

因为洛谷的题目本身就有很优秀的题解,所以本系列的主要是用于自身的学习打卡记录,如果在此基础上也能帮助到其他同学,那就再好不过了。顺带一提,可能有一定的内容是洛谷题解基础上增加了自己的理解构成的,侵,联,删。


一、题面

1. 原题(贴图)

79077c3d37dae87d9d22c4859ce0c46a.png
【戳我跳转到题目】


二、解析及AC代码

1.解析

本题很明显考查的是并查集,但是有三种不同的生物,各自还有同类,食物和天敌,好复杂啊!!!怎么办呢?
如果我们只使用一个并查集的话,明显存不下这么多的信息,那么我们就用三个来存就好了嘛(多就是美,大就是好)
注意,我们更新时需要要将三种不同的信息都更新哦

那么,此时同学们就可以自己去尝试一下了,如果还是不太理解,可以参考下博主下面的AC代码,会带有一定的注释哦

2.AC代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using namespace std;

const int N = 1e5 + 10;

int res;
//p[N]部分存本身,p[2*N]部分存猎物,p[3*N]部分存天敌
int p[N * 3];

int find(int x)
{
  if (p[x] != x)p[x] = find(p[x]);//压缩路径
  return p[x];
}

int main()
{
  int n,k;
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= n * 3; i++)p[i] = i;
  while(k--)
  {
  	char in[2];
  	int a, b;
  	scanf("%s %d %d", &in, &a, &b);
  	if (a > n || b > n)
  	{
  		res++;
  		continue;
  	}
  	if (*in == '1')
  	{
  	    //注意到底是要使用树根(即p[find(x)]),还是探测树根find(x)
  		if (find(a + n) == find(b) || find(b + n) == find(a))res++;
  		else p[find(a)] = find(b), p[find(a + n)] = find(b + n), p[find(a + 2 * n)] = find(b + 2 * n);
  	}
  	else if (*in == '2')
  	{
  	     //注意到底是要使用树根(即p[find(x)]),还是探测树根find(x)
  		if (find(b + n) == find(a) || find(a) == find(b)) res++;
  		else p[find(a + n)] = find(b), p[find(a)] = find(b + 2 * n), p[find(a + 2 * n)] = find(b + n);

  	}
  }
  printf("%d", res);
  return 0;
}

如果觉得有用还请点个赞吧,拜托拜托

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值