并查集——村村通(洛谷 P1536)
题目选自洛谷P1536
并查集的变相考察类型的题目
先处理每一条存在的边,即把每条存在的边所连接的两个结点用并查集合并起来。
然后通过记录不同的代表元个数,就可以知道有多少个集合,即有多少个连通块了。
可以发现,一条边只能把两个连通块合成为一个,即将连通块个数减少1,要实现全市任何两个村镇间都可以实现交通,即连通块只有一个,所以答案就是连通块个数-1,输出即可。
那么,有多少个连通块呢?
也就是有几个帮派! 当然就问 有几个老大了, 如果自己的老大是自己,那么自己就是这个帮派的老大了,就代表一个连通块。
即: find(i) = i;
题目描述
某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?
输入格式
输入包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目 n 和道路数目 m ;随后的 m 行对应 m 条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从 1 到 n 编号。
注意:两个城市间可以有多条道路相通。
输出格式
对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。
输入输出样例
输入 1
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
输出 1
1 0 2 998
说明/提示
数据规模与约定
对于 100% 的数据,保证 1≤n<1000 。
解题代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int f[1010];
int n,m,p,x,y;
void init(){for(int i=1;i<=n;i++)f[i] = i;
}
int find(int a){if(f[a]==a) return a;return f[a]=find(f[a]);
}
void merge(int a,int b){if(find(a) != find(b))f[find(a)] = find(b);
}
int main(){while(1){int ans=0;cin>>n;if(n==0) break;cin>>m;init();for(int i=1;i<=m;i++){cin>>x>>y;merge(x,y);}for(int i=1;i<=n;i++){if(find(i)==i) ans++; //有多少个组}cout<<ans-1<<endl; //组的个数减一就是答案}return 0;
}
并查集——村村通(洛谷 P1536)相关推荐
- P1536 村村通 洛谷
https://www.luogu.org/problem/show?pid=1536 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府"村村 ...
- 并查集——程序自动分析(洛谷 P1955)
题目选自洛谷P1955 比较复杂一点的并查集题目,还用到了离散化的思想 首先明确一点:相等具有传递性,不相等不具有传递性(Eg:若x1等于x2,x2等于x3时,显然x1=x3.但当x1不等于x2,x2 ...
- 并查集——关押罪犯(洛谷 P1525)
题目选自洛谷P1525 此题是一道很经典,而且很好的题目.思路也十分的新颖,比较的难以捉摸. 题面大意:(人性翻译) 给你m对矛盾关系,每对关系分别涉及到x,y两人,矛盾值为w 请你判断分配x和y到两 ...
- 洛谷P1536 村村通【并查集】
题目链接:P1536 村村通 程序说明: n个集合需要用n - 1条线连接起来,因此合并完集合后,循环遍历所有点,记录集合的总数,减一则为正确答案 代码如下: #include <iostrea ...
- 洛谷P1536村村通(并查集模板题)
问题出处: https://www.luogu.com.cn/problem/P1536 题目描述: 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府 " ...
- 洛谷P1536 村村通
链接:P1536 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定 ...
- 洛谷—— P1536 村村通
P1536 村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一 ...
- 洛谷 P1536 村村通
做题地址:https://www.luogu.com.cn/problem/P1536 这一题也是在考察并查集,不过这一次不是考察两个顶点是否处于同一块,而是询问区间块的个数. 找到区间块的个数后,再 ...
- P1536 村村通(并查集)
村村通 - 洛谷https://www.luogu.com.cn/problem/P1536 #include <iostream> #include <cstdio> #in ...
最新文章
- ios 应用 开发流程。。。
- live meeting中白板无法正常使用
- 一键 linux桌面安装vnc,Ubuntu 16.04 LTS一键安装VNC
- 初学oracle遇到些小麻烦
- VB 两种方法建立多级目录
- css文本溢出 so easy~
- 如何保证缓存与数据库双写时的数据一致性?
- 老外挑战360加固--实战分析(很详细)
- 苹果鼠标滚轮驱动_黑苹果仿冒秒控鼠标
- MDK编译过程及ARM编译工具链
- Linux添加中文字体
- Egret 2d 实现黑暗下光照效果
- 最新kali之hashcat
- 创建带图文的超级菜单(导航菜单)(二)
- 鸿蒙荣耀v40,荣耀V40系列放料:高配麒麟9000,将搭载鸿蒙2.0
- java.lang.ClassNotFoundException: com.sun.activation.registries.LogSupport
- java获取session失效时间_Java设置session超时(失效)的时间
- 详解广义线性模型的来龙去脉
- android rootfs_android.img,进度栏和Rootfsimg自动更新还应该解决了一些兼容性问题
- IP地址段计算方法——计算最大广播地址,最小网络地址