题目链接

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

代码

  1. import java.util.HashSet;
  2. import java.util.Scanner;
  3. public class Main {
  4. public final static int MAXN=1005;
  5. public static int[] pre=new int[MAXN];
  6. public static int[] rank=new int[MAXN];
  7. public static void main(String[] args) {
  8. Scanner in=new Scanner(System.in);
  9. while(in.hasNext()) {
  10. int N=in.nextInt();
  11. if(N==0) {break;}
  12. int M=in.nextInt();
  13. init(N);
  14. while(M-->0) {
  15. unite(in.nextInt(),in.nextInt());
  16. }
  17. HashSet<Integer> rootSet=new HashSet<Integer>();
  18. for(int i=1;i<=N;++i) {
  19. int root=find(i);
  20. if(!rootSet.contains(root)) {
  21. rootSet.add(root);
  22. }
  23. }
  24. System.out.println(rootSet.size()-1);
  25. }
  26. }
  27. public static void init(int N) {
  28. for(int i=1;i<=N;++i) {
  29. pre[i]=i;
  30. rank[i]=1;
  31. }
  32. }
  33. public static int find(int x) {
  34. return pre[x]==x?x:(pre[x]=find(pre[x]));
  35. }
  36. public static void unite(int x,int y) {
  37. int xRoot=find(x);
  38. int yRoot=find(y);
  39. if(xRoot!=yRoot) {
  40. if(rank[xRoot]>rank[yRoot]) {
  41. pre[yRoot]=xRoot;
  42. }
  43. else {
  44. if(rank[xRoot]==rank[yRoot]) {
  45. ++rank[yRoot];
  46. }
  47. pre[xRoot]=yRoot;
  48. }
  49. }
  50. }
  51. }

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. 轻音少女K-on闹钟,时钟,日历,整点报时

    在网上找了很久才找到这个东西, 所以分享出了,方便大家下载 链接: https://pan.baidu.com/s/11wB57F2Td1FPp9RBmTvg 密码: 2xt5

  2. Clion C++ 乱码,debug乱码

    Clion新建项目,默认是使用UTF-8 Clion点击运行图标,使用的terminal不能正常显示UTF-8,因为其使用的是GBK编码 所以只要将源文件编码改为GBK就好了 1.界面右下角,有个UT ...

  3. 蒲公英 &#183; JELLY技术周刊 Vol.18 关于 React 那些设计

    蒲公英 · JELLY技术周刊 Vol.18 自 2011 年,Facebook 第一次在 News Feed 上采用了 React 框架,十年来 React 生态中很多好用的功能和工具在诸多设计思想 ...

  4. SpringCloude简记_part3

    18. SpringCloud Alibaba Sentinel实现熔断与限流 18.1 Sentiel 官网 https://github.com/alibaba/Sentinel 中文 https ...

  5. @SuppressWarnings注解用法详解(转)

    原文连接https://blog.csdn.net/sysware_carol/article/details/52100580 今天来谈谈@SuppressWarnings注解的作用. J2SE 提 ...

  6. 第2章 Hive安装

    第2章 Hive安装 2.1 Hive安装地址 1.Hive官网地址 http://hive.apache.org/ 2.文档查看地址 https://cwiki.apache.org/conflue ...

  7. chromium 源码下载地址

    下载链接:https://gsdview.appspot.com/chromium-browser-official/

  8. Codeforces Round #665 (Div. 2)A-C题解

    A. Distance and Axis 题目:http://codeforces.com/contest/1401/problem/A 题解:对于n来说分两种情况,一是奇数,二则是偶数 ①奇数:对于 ...

  9. SuperSlide轮播切换

    <!-- 点击切换引入 --> <script type="text/javascript" src="js/jquery.js">&l ...

  10. Trapdoors for Hard Lattices and New Cryptographic Constructions

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. Abstract 我们展示了如何构造各种“trapdoor”密码工具,假设标准格问题的最 ...