题目链接

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]畅通工程(并查集)的更多相关文章

  1. HDU1232 畅通工程 并查集

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. ACM: 继续畅通工程-并查集-最小生成树-解题报告

    继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...

  3. ACM: 畅通工程-并查集-解题报告

    畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查城镇交通状况 ...

  4. B - 畅通工程(并查集)

    对并查集理解之后就可以做这种题了,虽说这种题做的不多,这道题做过才这么快搞定,可是还是挺happy滴,加油 Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接 ...

  5. NSOJ 畅通工程(并查集)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  6. hdu 1233 还是畅通工程 并查集or最小生成树

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 ...

  7. hdu1232 畅通工程 并查集的 应用

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  9. HDU - 1232 畅通工程-并查集模板

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

随机推荐

  1. 虚拟机解释器与bytecode对接

    心头一直有个疑问,jvm虚拟是如何对接class中的字节码的?或者说在未进入 JIT优化阶段时,解释器是如何对接的? 大概阐述 hotspot通过C++代码在堆上申请一块空间,向里面填充一组指令,然后 ...

  2. 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑

    因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...

  3. [源码解析] 当 Java Stream 遇见 Flink

    [源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...

  4. 顶级技术盛会KubeCon 2020,网易轻舟布道多云环境云原生应用交付

    在日前的KubeCon 2020中国线上峰会上,VMware中国研发中心架构师.Harbor项目创始人和维护者张海宁,和网易数帆轻舟事业部架构师.Harbor维护者裴明明,共同分享了如何在多云和多集群 ...

  5. 使用Postman工具做接口测试(五)——生成随机参数

    引言 我们平时使用最多的接口调试工具就是postman了,比如开发将一个接口给到你,你想看看接口是否正常.最常用的方法就是用postman去调一下.如果通,就写接口测试用例,反之,将开发打一顿吧o(* ...

  6. Url跳转漏洞常见

    Url跳转漏洞常见出现点: 1.用户登录.统一身份认证处,认证完后会跳转. 2.用户分享.收藏内容过后,会跳转. 3.跨站点认证.授权后,会跳转. 4.站内点击其它网址链接时,会跳转. Url跳转漏洞 ...

  7. eclipse git提交项目以及down项目大致步骤

    down git项目步骤: 复制了url之后,import projects项目选中from git ,会出现如下截图,信息会自动填充 填好信息一直Next即可 完成之后,打开“Git Reposit ...

  8. 个人项目wordcount

    1.Github项目地址:https://github.com/inimble/wordcount.git 2.估算耗费的时间(如右表) PSP2.1 Personal Software Proces ...

  9. 启用valgrind的MPI支持

    TL;DR sudo apt install valgrind-mpi 内存泄漏和越界问题,是C/C++程序常见问题.有一些工具提供了检测内存泄漏的功能,如 valgrind 的 memchecker ...

  10. mac安装conda后,终端的用户名前面有一个(base),最佳解决方案

    mac安装了conda后,前面会有一个(base),很烦人,终于找到最佳解决方案了: $ conda config --set auto_activate_base false 原因: 安装conda ...