并查集 概念: 并查集就是将数组中的数经过树状排列后, 如果寻找两个数是否属于同一集合, 直接找是否属于同一根节点的子树就可以。 路径压缩和按秩合并 路径压缩: 在每次执行 \(get\) 操作的同时, 把访问过的每个节点(也就是所查的元素的祖先,都直接指向树根) 每次 \(get\) 的均摊复杂度 ...
转载
2021-10-10 11:30:00
574阅读
2评论
比如食物链中,更新时就是模3,需要找到权值之间的规律 另外还有一种方法,就是建立三倍的并查集,第一个并查集是A, 第二个并查集是B,第三个并查集是C,输入关系时,把同类和天敌输入,可以利用并查集的传递性,A->B B->C可以传递到关系C->A这也正是题目所希望的其次,建立集合时,关系是对称的,所以查询时只需查询一个集合里是否是同类,或者查询某两个集合是否是天敌就
转载
2021-03-18 16:33:04
369阅读
2评论
1 #include 2 #include 3 using namespace std; 4 int f[1000010]; 5 int sum[1000010]; 6 int find(int x) 7 { 8 if(x!=f[x]) 9 { 10 int pre=f[x];//pre是x的一个父节点。 11 f[x]=find...
原创
2021-07-15 11:13:46
254阅读
更全的内容详见并查集全面讲解 带权并查集 内容: 我们可以在并查集的边上
转载
2021-08-08 19:14:00
81阅读
2评论
带权并查集种类并查集例题:种类并查集 洛谷 P2024 食物链对于这三种种类,同类可以用0表示,其他两种分别用1表示该结点被父节点吃,2表示该节点吃
原创
2023-02-07 12:52:08
250阅读
并查集由一个整数型的数组和两个函数构成。数组pre[ ]记录了每个点的前导点是什么,函数find是查
原创
2022-06-17 12:50:57
402阅读
并查集到带权并查集合并-查找问题在说并查集之前,我们先讲一下合并-查找问题合并-查找问题。顾名思义,就是既有合并又有查找操作的问题举个例子:有一群人,他们之间有若干好友关系如果A是B好友的好友,或者好友的好友的好友等等,即通过若干好友可以认识,那么我们说A和B是间接好友。如果两个人有直接或者间接好友关系,那么我们就说他们在同一个朋友圈中随着时间的变化,这群人中有可能会有新的朋友关系,比如A和C变成
转载
2023-09-02 16:39:40
57阅读
带权并查集我们为什么要学习带权并查集呢?我们知道,对于普通并查集而言,它反映的是集合与集合之间的关系(即元素是否处于这个集合),相当于是一个无权图,而集合内元素之间的关系并没有表明。如果我们一旦想体现出集合中元素之间的相互关系,即边权值,那么普通并查集必然不能实现,所以带权并查集就出来了。它不仅记录集合的关系,还记录着集合内元素的关系或者说是集合内元素连接线的权值。 这个本质实际上就是一个带权图。
1. 不带权重并查集三个操作: 初始化, 查找, 合并.#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int MAX_SIZE=1002;int Set_father[MAX_SIZE];int Set_Count[MAX_SIZE];void Initialization()
原创
2021-08-31 15:54:23
134阅读
题目:Wireless Network 题意:给定n台已损坏计算机的位置和计算机最远通信距离d,然后分别根据命令执行以下两种操作: 输出:能通信则输出"SUCCESS",否则输出"FAIL" 题解: 带权并查集还是那个重要的知识点——关系。 此题,我们使用一个repair数组存储每台电脑的状态(损坏
转载
2017-08-11 18:10:00
83阅读
2评论
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2818思路:Count[i]表示i下面的积木个数,路径压缩的时候更新一下即可,sum[i]表示以i为根的积木的个数。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 30000+30 7 int parent[MAXN]; 8 int sum[MAXN],Coun
转载
2013-06-10 11:07:00
120阅读
2评论
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3047思路:冲突的条件是:两个人坐在同一行,同时他们到根节点的差值等于他们之间的差值,这时就产生冲突了。于是我们可以用一个dist数组来保存节点到根的距离,而这个距离在路径压缩的时候更新一下就可以了,dist[x]+=dist[parent[x]]。然后就是合并后的距离,令r1=Find(u),r2=Find(v),于是合并时就有parent[r2]=r1,dist[r2]=dist[u]+w-dist[v]。盗用一张图: 1 #include<iostream> 2 #include&
转载
2013-06-10 09:55:00
117阅读
2评论
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038思路:sum[x]表示区间[x,f[x]]的和,这个可以在路径压缩的时候更新,对于一组数据(u,v,w),令r1=Find(u),r2=Find(v),于是若r1==r2,此时u,v就有了相同的参考点,而sum[u]为区间[u,r1(r2)]的和,sum[v]为区间[v,r2(r1)]的和,于是只需判断w==sum[v]-sum[u]即可;若r1<r2,此时可以分为两种情况,(u,v,r1,r2)或者(u,r1,v,r2),对于情况1来说,此时father[r1]=r2,sum[r1]=
转载
2013-06-08 11:07:00
41阅读
2评论
#include#include#define N 200100struct node {int x,count;}pre[N];int find(int n) {if(n!=pre[n].x) {int h=pre[n].x;pre[n].x=find(pre[n].x);pre[n].count...
转载
2013-12-01 18:12:00
27阅读
\(\huge 并查集\) \(\Large\rm 算法简介\) $\quad$并查集可以用来维护一类具有传递性的关系,维护形如将 \(x\) 与 \(y\) 所在集合合并和询问 \(x\) 和 \(y\) 是否在同一个集合的操作。 \(\large\rm 查询祖先节点\) $\quad$对于普通并 ...
转载
2021-08-25 08:03:00
111阅读
2评论
题意:有n个结点,给出了q个操作,操作是a b string表示结点a到结点b的和是奇数或偶
原创
2023-06-29 00:06:35
67阅读
题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃
原创
2023-06-29 00:07:06
32阅读
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 71361 Accepted: 21131 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动
转载
2017-05-05 16:03:00
95阅读
2评论
带权并查集区间统计例题:HDU Zjnu Stadium(模板) HDU 3038 How Many Answers Are Wrong与普通并查集不同是新增加一个属性: dist[a]:表示
原创
2023-02-07 12:51:57
88阅读