POJ 1182 ——食物链 经典并查集

一道关于并查集的经典问题,题目要求处理A、B、C三种动物构成的食物链,判断给定的动物关系描述中有多少条是假话。通过初始化、find()和merge()函数实现并查集操作,以确定动物间的关系,并依据关系判断假话。重点在于理解rk[i]的含义和关系转换规则。
摘要由CSDN通过智能技术生成
  • 题目链接 : http://poj.org/problem?id=1182
  • 题意 :有A,B,C三种动物构成环形的食物链,现给你M句话,每句话形式"D X Y",1表示X和Y同类,2表示X吃Y。判断假话有多少句。其中 :1)与前面的话冲突 2)X和Y大于动物编号N 3)D =2 &&X =Y 是假话。
  • 思路 :这是一道经典的并查集题目。涉及到并查集,我们就针对这道题目设置并查集中各个元素的含义。
    我们将可以确定关系的放在一个集合(即同类或者X 吃/被吃 Y)。rk[i]表示i与根节点的关系 :
    rk[i] = 0 表示i和根节点是同类
    rk[i] = 1 表示根节点吃i
    rk[i] = 2 表示i吃根节点

一、初始化: node[i] = i , rk[i] = 0。 即每个节点都属于独立的集合,
二、find() 函数 : 除去 node[x] = find(node[x])外,每次递归还需要更新rk[x]的值。在没有更新之前 rk[x]代表x和node[x]的关系,每次更新将rk[x]设置为x和根节点的关系。即t = node[x] rk[x] = (rk[x] + rk[t]) % 3。
这里有两个点需要解释一下
1)t = node[x]的目的。find函数中有 node[x] = find(node[x]),如果不设置t = node[x]ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值