[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 畅通工程-并查集模板
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
随机推荐
- 虚拟机解释器与bytecode对接
心头一直有个疑问,jvm虚拟是如何对接class中的字节码的?或者说在未进入 JIT优化阶段时,解释器是如何对接的? 大概阐述 hotspot通过C++代码在堆上申请一块空间,向里面填充一组指令,然后 ...
- 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑
因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...
- [源码解析] 当 Java Stream 遇见 Flink
[源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...
- 顶级技术盛会KubeCon 2020,网易轻舟布道多云环境云原生应用交付
在日前的KubeCon 2020中国线上峰会上,VMware中国研发中心架构师.Harbor项目创始人和维护者张海宁,和网易数帆轻舟事业部架构师.Harbor维护者裴明明,共同分享了如何在多云和多集群 ...
- 使用Postman工具做接口测试(五)——生成随机参数
引言 我们平时使用最多的接口调试工具就是postman了,比如开发将一个接口给到你,你想看看接口是否正常.最常用的方法就是用postman去调一下.如果通,就写接口测试用例,反之,将开发打一顿吧o(* ...
- Url跳转漏洞常见
Url跳转漏洞常见出现点: 1.用户登录.统一身份认证处,认证完后会跳转. 2.用户分享.收藏内容过后,会跳转. 3.跨站点认证.授权后,会跳转. 4.站内点击其它网址链接时,会跳转. Url跳转漏洞 ...
- eclipse git提交项目以及down项目大致步骤
down git项目步骤: 复制了url之后,import projects项目选中from git ,会出现如下截图,信息会自动填充 填好信息一直Next即可 完成之后,打开“Git Reposit ...
- 个人项目wordcount
1.Github项目地址:https://github.com/inimble/wordcount.git 2.估算耗费的时间(如右表) PSP2.1 Personal Software Proces ...
- 启用valgrind的MPI支持
TL;DR sudo apt install valgrind-mpi 内存泄漏和越界问题,是C/C++程序常见问题.有一些工具提供了检测内存泄漏的功能,如 valgrind 的 memchecker ...
- mac安装conda后,终端的用户名前面有一个(base),最佳解决方案
mac安装了conda后,前面会有一个(base),很烦人,终于找到最佳解决方案了: $ conda config --set auto_activate_base false 原因: 安装conda ...