博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并查集/生成树问题 | 问题集合
阅读量:7068 次
发布时间:2019-06-28

本文共 2351 字,大约阅读时间需要 7 分钟。

写在前面

似乎没什么可以写的?

那还是扯一下吧.

题目大部分带题号没给特殊地址/链接的都是洛谷的题

然后亲戚和朋友两道题库被我刷烂的题我就不搬进来了(:懒

 


 

 

P1536 村村通

题目描述

某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?

输入格式:

每个输入文件包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目N(N<1000)和道路数目M;随后的M行对应M条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从1到N编号。

注意:两个城市间可以有多条道路相通。例如:

3 3 1 2 1 2 2 1 这组数据也是合法的。当N为0时,输入结束。

输出格式:

对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。

输入输出样例

输入样例#1:
4 21 34 33 31 21 32 35 21 23 5999 00
输出样例#1:
102998

 

解题思路

    •   给定m条村庄间相连的关系,求需要修建几条路使得全部村庄直接/间接地联通.
    •   并查集裸题.
    •        只需要根据读入关系,对每次读入的关系进行合并,使得每一条线路能直接/间接联通的路在一个集合里
    •        然后再判断   ,若条件成立,Ans_sum++.
    •        条件成立是什么意思呢?说明:1、没有村庄和它相连。2、别的村庄都指向它。
    •       当Ans_sum = 1时,说明所有的路都在一个集合里,不用再修路了.

    •       当Ans_sum > 1 时,说明有Ans_sum个村庄和他们的子集都互不相连,所有需要Ans_sum-1条路.

关于代码

#include 
#include
#include
#include
#include
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时,输入结束。

输出格式:

对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。

 

输入输出样例

输入样例#1:
4 21 34 33 31 21 32 35 21 23 5999 00
输出样例#1:
102998

 

解题思路

    •   给定m条村庄间相连的关系,求需要修建几条路使得全部村庄直接/间接地联通.
    •   并查集裸题.
    •        只需要根据读入关系,对每次读入的关系进行合并,使得每一条线路能直接/间接联通的路在一个集合里
    •        然后再判断   ,若条件成立,Ans_sum++.条件成立是什么意思呢?说明:1、没有村庄和它相连。2、别的村庄都指向它。
    •       当Ans_sum = 1时,说明所有的路都在一个集合里,不用再修路了.

    •       当Ans_sum > 1 时,说明有Ans_sum个村庄和他们的子集都互不相连,所有需要Ans_sum-1条路.

关于代码

村村通

 

转载于:https://www.cnblogs.com/Yuns/p/7391428.html

你可能感兴趣的文章
手机操作系统:自主力量能否崛起
查看>>
Shell在大数据时代的魅力:从一道百度大数据面试题想到的点滴
查看>>
说说參数传递(泛型托付)
查看>>
CentOS6.10下安装mysql-5.7.24
查看>>
【C#公共帮助类】 ToolsHelper帮助类
查看>>
八皇后问题
查看>>
切蛋糕
查看>>
关于对于CSS的字体单位
查看>>
TCP协议学习总结(上)
查看>>
敏捷 扑克上的时间估算(转)
查看>>
从JDBC程序看为什么需要Mybatis
查看>>
jQuery Ajax
查看>>
压缩感知中的数学知识:稀疏、范数、符号arg min
查看>>
《JavaScript高级程序设计》笔记
查看>>
刚刚在园里看到的一个简单的做连接字符串的方法.
查看>>
JQ_简单瀑布流
查看>>
测试管理-测试问题监控
查看>>
thinkphp的taglib的使用方法
查看>>
tecplot批量导出图片_Fluent 后处理软件Tecplot宏批量处理cas,dat为图片
查看>>
锂电池放空后充不进电_充电锂电池,只几个月不用,为什么就再也充不进电了?...
查看>>