并查集/生成树问题 | 问题集合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集/生成树问题 | 问题集合相关的知识,希望对你有一定的参考价值。
写在前面
似乎没什么可以写的?
那还是扯一下吧.
题目大部分带题号没给特殊地址/链接的都是洛谷的题
然后亲戚和朋友两道题库被我刷烂的题我就不搬进来了(:懒
P1536 村村通
题目描述
某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?
输入格式:
每个输入文件包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目N(N<1000)和道路数目M;随后的M行对应M条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从1到N编号。
注意:两个城市间可以有多条道路相通。例如:
3 3 1 2 1 2 2 1 这组数据也是合法的。当N为0时,输入结束。
输出格式:
对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。
输入输出样例
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998
解题思路
- 给定m条村庄间相连的关系,求需要修建几条路使得全部村庄直接/间接地联通.
- 并查集裸题.
- 只需要根据读入关系,对每次读入的关系进行合并,使得每一条线路能直接/间接联通的路在一个集合里
- 然后再判断 ,若条件成立,Ans_sum++.条件成立是什么意思呢?说明:1、没有村庄和它相连。2、别的村庄都指向它。
当Ans_sum = 1时,说明所有的路都在一个集合里,不用再修路了.
当Ans_sum > 1 时,说明有Ans_sum个村庄和他们的子集都互不相连,所有需要Ans_sum-1条路.
关于代码
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; int f[1010]; int Find(int x){ if (f[x] != x) f[x] = Find(f[(x)]); return f[x]; } void Uni(int x , int y){ f[Find(x)] = f[Find(y)]; return; } int main(){ ios :: sync_with_stdio(0); int n , m; while(cin >> n && n != 0){ int a , b; cin >> m; for (int i = 1;i <= n;++i) f[i] = i; for (int i = 1;i <= m;++i){ cin >> a >> b; Uni(a , b); } int Ans_sum = 0; for (int i = 1;i <= n;++i){ if (f[i] == i) Ans_sum++; } memset(f,0,sizeof(f)); cout << Ans_sum-1 << endl; } return 0; }
题目描述
某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?
输入格式:
每个输入文件包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目N(N<1000)和道路数目M;随后的M行对应M条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从1到N编号。
注意:两个城市间可以有多条道路相通。例如:
3 3 1 2 1 2 2 1 这组数据也是合法的。当N为0时,输入结束。
输出格式:
对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。
输入输出样例
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998
解题思路
- 给定m条村庄间相连的关系,求需要修建几条路使得全部村庄直接/间接地联通.
- 并查集裸题.
- 只需要根据读入关系,对每次读入的关系进行合并,使得每一条线路能直接/间接联通的路在一个集合里
- 然后再判断 ,若条件成立,Ans_sum++.条件成立是什么意思呢?说明:1、没有村庄和它相连。2、别的村庄都指向它。
当Ans_sum = 1时,说明所有的路都在一个集合里,不用再修路了.
当Ans_sum > 1 时,说明有Ans_sum个村庄和他们的子集都互不相连,所有需要Ans_sum-1条路.
关于代码
以上是关于并查集/生成树问题 | 问题集合的主要内容,如果未能解决你的问题,请参考以下文章