食物链(带全并查集)

/*
初始化并查集的所有集合 和根节点直接的关系
找到父节点
合并集合,并更新点和父节点直接的关系

判断是否是真话
if 父节点不相等 true 加入集合中
if 相等
if() 判断在集合中与 根节点的关系对不对 对
true [加入集合]错 false

主函数:
创建集合
找到2点的父节点
判断是否是真话
假话 count++
真话 和并集合
*/


#include<stdio.h>
#include<string.h>
#define MAX 50005
int father[MAX]={0};
int rank[MAX]={0};
int k,n;
void make_set()
{
int i;
for(i=1;i<=n;i++)
{
father[i]=i;rank[i]=0;//父节点都是自己 和父节点的关系都是同类0
}
}
int find_father(int x)//只找到父节点
{
if(father[x]==x) return x;

int lao=father[x];//更新原来集合下所有点的根节点 和 关系值
father[x]= find_father(father[x]);
rank[x]=(rank[x]+rank[lao])%3;

return father[x];
}
void union_set(int r,int x,int y)
{
int fx,fy;
//先将x和y的根节点找到
fx=find_father(x);
fy=find_father(y);
if(fx==fy) return ;

father[fx]=fy;//将x的集合加到y的集合下面
rank[fx]=(rank[y]+r-rank[x]+3)%3;//+3防止出现负的情况 通过向量可以确定关系
}
int isTrue(int r,int x,int y)
{
int fx,fy;
if(x>n || y>n || ((x==y)&&((r+1)==2)) )
return 0;

//先将x和y的根节点找到
fx=find_father(x);
fy=find_father(y);

if(fx!=fy)//证明原先的集合中没有他们之间的关系 可以加入到集合中
return 1;
else
{
if(rank[x]==((rank[y]+r)%3))//如果x-y的关系正确
return 1;
else
return 0;
}
}
int main(void)
{
int i,r,x,y,fx,fy,count=0;

scanf("%d%d",&n,&k);
make_set();
for(i=1;i<=k;i++)
{
scanf("%d%d%d",&r,&x,&y);
if(isTrue(r-1,x,y))
{
union_set(r-1,x,y);
}
else
{
count++;
}
}
printf("%d\n",count);
return 0;
}

食物链(带全并查集)

时间: 2024-08-01 18:46:30

食物链(带全并查集)的相关文章

POJ 1182 食物链 带权并查集

动物王国中有三类动物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句话有的是真的,有的是假的.当一句话满足下列三条之一时,这句话就是假话,否

ACWing 240. 食物链 带权并查集

题目: 动物王国中有三类动物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

POJ 1182 食物链 (带权并查集 &amp;&amp; 向量偏移)

题意 : 中文题, 直接去POJ  1182看即可 分析 : 通过普通并查集的整理归类, 能够单纯地知道某些元素是否在同一个集合内.但是题目不仅只有种类之分, 还有种类之间的关系, 即同类以及吃与被吃, 而且重点是题目问的并不是种类是否在一个集合内, 而是考察给出的关系是否矛盾.在解释之前, 先明白一个问题, 对于给出的关系, 如果我不能通过前面的信息来推断出来, 是不是不能够判断现在给出关系的对错?那就将这个信息作为真命题并存储起来, 方便后面判断.有了刚刚前面的陈述, 可以知道两个东西=>

poj1182~食物链~带权并查集

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63050   Accepted: 18482 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同

【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句话有的是真的,有的是假的.当一句话满足下列三条之

POJ 1182 食物链 [并查集 带权并查集 开拓思路]

传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Appoint description:  System Crawler  (2015-01-27) Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物

poj1182食物链,经典带权并查集

动物王国中有三类动物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句话有的是真的,有的是假的.当一句话满足下列三条之一时,这句话就是假话,否

POJ 1182 食物链(带权并查集)

http://poj.org/problem?id=1182 题意: 动物王国中有三类动物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句话

带权并查集(含种类并查集)【经典模板】 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug&#39;s life(简单) ③hihoCoder 1515 : 分数调查

带权并查集: 增加一个 value 值,并且每次合并和查找的时候需要去维护这个 value 例题一 :POJ 1182 食物链(经典) 题目链接:https://vjudge.net/contest/339425#problem/E 带权并查集的解法 定义两个数组fa[ ]和rela[ ],fa用来判断集合关系,rela用来描述其与根节点的关系.因为关系满足传递性,所以可以推导出给出条件下的当前关系,在判断与之前已有关系是否矛盾. 本题的解法巧妙地利用了模运算,rela数组用0表示同类,1表示当