并查集(究竟有几个祖先?)
目录
1,我们要怎么找祖先
2,我们要怎么把祖先相同的合在一起
3,例题
思路很明显,把修过路的捆绑一起,一直按价格最低的路修,一直累计就好了
AC代码
‘并’意思是把祖先相同的合为一体,‘查’是当我并完后,我就能明天究竟谁与谁祖先相同了
通过爸爸找爸爸的爸爸,这种思想我们很容易联系到递归,那么我们可以通过一个递归函数来找爸爸
1,我们要怎么找祖先
我们先建立一个数组,fa[x],即fa[x]是x的爸爸,(祖先的爸爸是自己,fa[x]=x),然后一个递归函数,find(x),找x祖先,只要fa[x]!=x,(说明fa[x]只是个爸爸,但不是祖先,他也是某人的儿子)我们就一直递归,直到找到祖先
int find(int x) {if(fa[x]!=x)fa[x] = find(fa[x]);//爸爸不是祖先,继续找爸爸,当然,爸爸祖先要更新(因为前面可能已经换过祖先了)return fa[x]; //是祖先,直接返回
}
2,我们要怎么把祖先相同的合在一起
能找到祖先,剩下就很简单了,写一个unit函数,把a,b的祖先合一起(即fa[find(a)]=find(b),我们让本来是祖先的find(a)有了爸爸,即fa[find(a)]不再等于自己了,他的爸爸变成find(b)(b的祖先)
void unit(int a, int b) {fa[find(a)] = find(b);
}
3,例题
我们通过一道HDU的题来了解一下
思路很明显,把修过路的捆绑一起,一直按价格最低的路修,一直累计就好了
AC代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 110;
int fa[N];
struct city {int a, b, p,now; //a,b为城市,p为价格,now为当前道路是否修建}arr[N * (N - 1) / 2];//注意,道路情况不是n条,是N(N-1)/2条,数组不要开小了bool cmp(city x, city y) { //建立sort排序根据谁的价格小来排序return x.p < y.p;
}int find(int x) {if(fa[x]!=x)fa[x] = find(fa[x]);//爸爸不是祖先,继续找爸爸,当然,爸爸祖先要更新(因为前面可能已经换过祖先了)return fa[x]; //是祖先,直接返回
}int unit(city x) {if (find(x.a) == find(x.b))return 0; //祖先相同,说明已经有路把他们连在一起,不用浪费钱修路了else {fa[find(x.a)] = find(x.b);//不相同,我就修,然后合在一起,表示他们有修路连一起了return x.p;//返回修路的价格}
}int main() {std::ios::sync_with_stdio(false);//这个是解绑cin,cout与stdin的同步,提高速度,不然这里直接用就被卡时间TLE了int n;while (cin >> n&&n) {for (int i = 1; i <= n; ++i)fa[i] = i;//初始自己就是自己的祖先for (int i = 1; i <= n * (n - 1) / 2; ++i) {//再次强调,/注意,道路情况不是n条,是N(N-1)/2条cin >> arr[i].a >> arr[i].b >> arr[i].p >> arr[i].now;if (arr[i].now == 1)arr[i].p = 0;//如果你有修过路,那么我不用再修,价格归为0,方便后面排序}sort(arr + 1, arr + 1 + n * (n - 1) / 2, cmp);//再次强调,/注意,道路情况不是n条,是N(N-1)/2条,排序也不是只排n条int ans = 0;//总价格for (int i = 1; i <= n * (n - 1) / 2; ++i)ans += unit(arr[i]);cout << ans << endl;}return 0;
}
并查集(究竟有几个祖先?)相关推荐
- 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦
[bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...
- hdu 3635 Dragon Balls 龙珠 带权并查集
每次移动都是一个群龙珠移动到另一群龙珠所在的城市里面.所以这两个城市之间都不会空. 用并查集表示,每一个祖先节点的序号和他们所在城市的序号相同. 无论路径如何压缩,子结点的移动次数=父节点的移动次数+ ...
- [hihoCoder]无间道之并查集
题目大意: #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息--额,说远了,总之, ...
- 【坐在马桶上看算法】啊哈算法13:零基础彻底弄懂“并查集“
并查集 题目描述 分析 并查集模板 因为最近在学并查集,在别的博客看到关于并查集的知识点,讲解得很清晰,理解更深,所以搬运到csdn来分享一下好资源. 题目描述 快过年了,犯罪分子们也开始为年终奖&q ...
- Leetcode——唯唯诺诺对并查集的初次相见
基本概念 并查集是一种数据结构 并查集这三个字,一个字代表一个意思. 并(Union),代表合并 查(Find),代表查找 集(Set),代表这是一个以字典为基础的数据结构,它的基本功能是合并集合中的 ...
- L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(C语言)(并查集)(dfs)(测试点坑)
题目 L2-016 愿天下有情人都是失散多年的兄妹 (25 分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请 ...
- 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈
题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...
- 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用
二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...
- 暑期集训5:并查集 线段树 练习题F: HDU - 1166
2018学校暑期集训第五天--并查集 线段树 练习题F -- HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...
- [NOI2002] 银河英雄传说(带权并查集好题)
题解: 用两个变量来维护: 1.sz[i]维护第i列元素的个数 2.pre[x]维护第x元素到当前队首的距离. 在并查集是不断维护这两个值. 至于如何维护看下图和文字解释 当然,这样维护还是不够的,对 ...
最新文章
- php限制字符输入,.NET_asp.net(c#)限制用户输入规定的字符和数字的代码,一下是这个代码: 只允许 用 - phpStudy...
- flexbox_Flexbox中的Flex基础属性
- 使用ThinkPHP实现生成/校验验证码功能
- ucache来广营(望京)机房
- 安装win2008R2启动修复失败
- 分布式文件系统之MooseFS----管理优化
- jzoj3347,bzoj3257-[NOI2013模拟]树的难题【树形dp】
- 扁平图文列表小程序模板
- AI杂谈(2)请教支持向量机用于图像分类
- 三星手机即将获得完整的Linux发行版支持
- 一起谈.NET技术,HubbleDotNet 和 Lucene.Net 匹配相关度的比较
- selenium 简介 及浏览器配置
- 判断一个对象是否存在
- java常用类、最常用的包
- 微信小程序项目实例——图片处理小工具(自制低配版美图秀秀)
- SAP MM 用客户寄售库存管理方式来管理周转箱等可回收物料
- Windows改装成Linux,Windows系统改装成Linux系统
- SDN开源,从你的全世界路过
- MR756-ASEMI车用整流二极管MR756
- Funk吉他学习笔记001 【6 Sick Funk Guitar Grooves From Leo Nocentelli of The Meters】
热门文章
- 国内舆情监测系统,国内舆情监测通过什么技术实现
- java的一些基础知识(引用BlogJava 落花飞雪)
- 目标检测—基于Yolov5的目标检测项目(学习笔记)
- Typora 保姆级教程
- Java编写“诸神黄昏“小游戏
- PartyOK酒吧游戏实用手册
- java 字体选择器_字体选择器
- 长虹电视android优化要多久,长虹电视运行卡顿内存不足怎么样?最新优化教程...
- python3利用pandas读取excel的列取出最大最小值
- 用贝塞尔曲线玩出来的花样简直不要太美