[HDOJ1232]畅通工程(并查集)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1232
题目描述
Problem Description
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。
Sample Input
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
Sample Output
1
0
2
998
解体思路
求连通分支数,道路数即为联通分支数-1,使用并查集。
相关知识:并查集union-find
作用
维护无向图的连通性。
核心思想
- (查)判断两个结点是否连通:
- 每个连通集用一个代表节点标志集合。用树形结构存储一个连通集,根节点即为这个连通集的标志节点。若两个节点的根节点相同,说明两个节点属于同一个连通集。
- 路径压缩:为维持树的高度尽量小,当查找两个节点属于同一个连通集后,把途径的所有节点的父节点都直接赋值为标志节点。
- 时间复杂度:使用路径压缩后,查找时间复杂度可近似认为是常数。
- (并)将两个节点所在集合连通:将一个节点的根节点挂在另一个节点的根节点上。具体地,高度小的树挂在高度搞的树的下面,保证树不退化,即高度维持稳定。具体谁和谁连通,依题目而定。
实现
存储结构:
- pre[节点数]:pre数组维护了多棵树,保存当前结点的父结点。若pre[i]=i,则表示节点i为
- rank[节点数]:表示以当前结点为根的树的高度。
- value[节点数] (可选):存储当前结点的值,若值为角标,则不需要该数组。
操作方法:
- init():初始化pre[i]=i;rank[I]=1;
- find():查
- unite():并
todo
学习并查集进阶
http://www.cnblogs.com/xzxl/p/7341536.html
代码
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public final static int MAXN=1005;
public static int[] pre=new int[MAXN];
public static int[] rank=new int[MAXN];
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()) {
int N=in.nextInt();
if(N==0) {break;}
int M=in.nextInt();
init(N);
while(M-->0) {
unite(in.nextInt(),in.nextInt());
}
HashSet<Integer> rootSet=new HashSet<Integer>();
for(int i=1;i<=N;++i) {
int root=find(i);
if(!rootSet.contains(root)) {
rootSet.add(root);
}
}
System.out.println(rootSet.size()-1);
}
}
public static void init(int N) {
for(int i=1;i<=N;++i) {
pre[i]=i;
rank[i]=1;
}
}
public static int find(int x) {
return pre[x]==x?x:(pre[x]=find(pre[x]));
}
public static void unite(int x,int y) {
int xRoot=find(x);
int yRoot=find(y);
if(xRoot!=yRoot) {
if(rank[xRoot]>rank[yRoot]) {
pre[yRoot]=xRoot;
}
else {
if(rank[xRoot]==rank[yRoot]) {
++rank[yRoot];
}
pre[xRoot]=yRoot;
}
}
}
}
reference
https://www.cnblogs.com/xzxl/p/7226557.html
[HDOJ1232]畅通工程(并查集)的更多相关文章
- HDU1232 畅通工程 并查集
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- ACM: 继续畅通工程-并查集-最小生成树-解题报告
继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...
- ACM: 畅通工程-并查集-解题报告
畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查城镇交通状况 ...
- B - 畅通工程(并查集)
对并查集理解之后就可以做这种题了,虽说这种题做的不多,这道题做过才这么快搞定,可是还是挺happy滴,加油 Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接 ...
- NSOJ 畅通工程(并查集)
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- hdu 1233 还是畅通工程 并查集or最小生成树
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 ...
- hdu1232 畅通工程 并查集的 应用
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu 1863 畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others) M ...
- HDU - 1232 畅通工程-并查集模板
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
随机推荐
- 轻音少女K-on闹钟,时钟,日历,整点报时
在网上找了很久才找到这个东西, 所以分享出了,方便大家下载 链接: https://pan.baidu.com/s/11wB57F2Td1FPp9RBmTvg 密码: 2xt5
- Clion C++ 乱码,debug乱码
Clion新建项目,默认是使用UTF-8 Clion点击运行图标,使用的terminal不能正常显示UTF-8,因为其使用的是GBK编码 所以只要将源文件编码改为GBK就好了 1.界面右下角,有个UT ...
- 蒲公英 · JELLY技术周刊 Vol.18 关于 React 那些设计
蒲公英 · JELLY技术周刊 Vol.18 自 2011 年,Facebook 第一次在 News Feed 上采用了 React 框架,十年来 React 生态中很多好用的功能和工具在诸多设计思想 ...
- SpringCloude简记_part3
18. SpringCloud Alibaba Sentinel实现熔断与限流 18.1 Sentiel 官网 https://github.com/alibaba/Sentinel 中文 https ...
- @SuppressWarnings注解用法详解(转)
原文连接https://blog.csdn.net/sysware_carol/article/details/52100580 今天来谈谈@SuppressWarnings注解的作用. J2SE 提 ...
- 第2章 Hive安装
第2章 Hive安装 2.1 Hive安装地址 1.Hive官网地址 http://hive.apache.org/ 2.文档查看地址 https://cwiki.apache.org/conflue ...
- chromium 源码下载地址
下载链接:https://gsdview.appspot.com/chromium-browser-official/
- Codeforces Round #665 (Div. 2)A-C题解
A. Distance and Axis 题目:http://codeforces.com/contest/1401/problem/A 题解:对于n来说分两种情况,一是奇数,二则是偶数 ①奇数:对于 ...
- SuperSlide轮播切换
<!-- 点击切换引入 --> <script type="text/javascript" src="js/jquery.js">&l ...
- Trapdoors for Hard Lattices and New Cryptographic Constructions
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. Abstract 我们展示了如何构造各种“trapdoor”密码工具,假设标准格问题的最 ...