目录

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;
}

并查集(究竟有几个祖先?)相关推荐

  1. 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    [bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 ​ 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...

  2. hdu 3635 Dragon Balls 龙珠 带权并查集

    每次移动都是一个群龙珠移动到另一群龙珠所在的城市里面.所以这两个城市之间都不会空. 用并查集表示,每一个祖先节点的序号和他们所在城市的序号相同. 无论路径如何压缩,子结点的移动次数=父节点的移动次数+ ...

  3. [hihoCoder]无间道之并查集

    题目大意: #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息--额,说远了,总之, ...

  4. 【坐在马桶上看算法】啊哈算法13:零基础彻底弄懂“并查集“

    并查集 题目描述 分析 并查集模板 因为最近在学并查集,在别的博客看到关于并查集的知识点,讲解得很清晰,理解更深,所以搬运到csdn来分享一下好资源. 题目描述 快过年了,犯罪分子们也开始为年终奖&q ...

  5. Leetcode——唯唯诺诺对并查集的初次相见

    基本概念 并查集是一种数据结构 并查集这三个字,一个字代表一个意思. 并(Union),代表合并 查(Find),代表查找 集(Set),代表这是一个以字典为基础的数据结构,它的基本功能是合并集合中的 ...

  6. L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(C语言)(并查集)(dfs)(测试点坑)

    题目 L2-016 愿天下有情人都是失散多年的兄妹 (25 分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请 ...

  7. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  8. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用

    二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...

  9. 暑期集训5:并查集 线段树 练习题F:  HDU - 1166 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题F  --   HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

  10. [NOI2002] 银河英雄传说(带权并查集好题)

    题解: 用两个变量来维护: 1.sz[i]维护第i列元素的个数 2.pre[x]维护第x元素到当前队首的距离. 在并查集是不断维护这两个值. 至于如何维护看下图和文字解释 当然,这样维护还是不够的,对 ...

最新文章

  1. php限制字符输入,.NET_asp.net(c#)限制用户输入规定的字符和数字的代码,一下是这个代码: 只允许 用 - phpStudy...
  2. flexbox_Flexbox中的Flex基础属性
  3. 使用ThinkPHP实现生成/校验验证码功能
  4. ucache来广营(望京)机房
  5. 安装win2008R2启动修复失败
  6. 分布式文件系统之MooseFS----管理优化
  7. jzoj3347,bzoj3257-[NOI2013模拟]树的难题【树形dp】
  8. 扁平图文列表小程序模板
  9. AI杂谈(2)请教支持向量机用于图像分类
  10. 三星手机即将获得完整的Linux发行版支持
  11. 一起谈.NET技术,HubbleDotNet 和 Lucene.Net 匹配相关度的比较
  12. selenium 简介 及浏览器配置
  13. 判断一个对象是否存在
  14. java常用类、最常用的包
  15. 微信小程序项目实例——图片处理小工具(自制低配版美图秀秀)
  16. SAP MM 用客户寄售库存管理方式来管理周转箱等可回收物料
  17. Windows改装成Linux,Windows系统改装成Linux系统
  18. SDN开源,从你的全世界路过
  19. MR756-ASEMI车用整流二极管MR756
  20. Funk吉他学习笔记001 【6 Sick Funk Guitar Grooves From Leo Nocentelli of The Meters】

热门文章

  1. 国内舆情监测系统,国内舆情监测通过什么技术实现
  2. java的一些基础知识(引用BlogJava 落花飞雪)
  3. 目标检测—基于Yolov5的目标检测项目(学习笔记)
  4. Typora 保姆级教程
  5. Java编写“诸神黄昏“小游戏
  6. PartyOK酒吧游戏实用手册
  7. java 字体选择器_字体选择器
  8. 长虹电视android优化要多久,长虹电视运行卡顿内存不足怎么样?最新优化教程...
  9. python3利用pandas读取excel的列取出最大最小值
  10. 用贝塞尔曲线玩出来的花样简直不要太美