题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1232

题目描述:

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 
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

解题思路:开始接触这道题的时候作为萌新的我还并不知道神马并查集。不过跟着感觉走也把题做出来了2333333~先说说我的想法,然后再说专业的并查集算法。

本题意是有N个点和已经存在的M条边,我们想办法让这些个N连成串(专业的术语叫做生成树)

比如:

而我们需要做的就是使他们变成

他的连接规则可以是杂乱无章的,你想怎么连就怎么连(因为本题边没有权值,相对来说比较简单)

我们倒过来看,很明显就是一颗树了~

题中已经存在若干个边了,所以我们拿到的应该是这个样子的

如果把他们连在一起,我们需要再增加多少条边呢?很显然,3条(N-1)。所以我们需要解决的就是统计已经连接成一堆的个数

我们把这几个串拉平来看:

6→3

2→1→8

5→4

7

我们把它们当作火车,比如说6是车头,3是车尾。那么我们发现,当我们走到某一节车厢的时候,我们抱着不撞南墙不回头的精神

一直往右走,最终就会走到车尾,那么有几个独立的堆,就有几个独立的车尾。如果我想把两列火车连起来,比如说当1号和3连接了

那么我们就先从1走到8车尾,然后使两个车尾连接,谁连谁都无所谓,假设8→3,那么3就是最终的车尾。我们会发现车头可以是无数个

但是无所谓,因为我们只判断有多少个车尾就好了。

这是我当初的个人想法,可能不是很好理解,那么我们换一种说法:

大家看一下这几张图,有人可能会问,两个点只要连接起来就好,至于谁连谁,并没有什么影响,也就是说这是一个无向图。那么既然是无向,为什么我要用

→号连接呢?或者说,我们为什么一定要把这个问题归类与“树”呢?因为树有一个特点,就是只有一个根节点。我们判断两个点是否在一个

集合(火车)(树)里,唯一的方法就是判断他们是否同属于一个根节点(车尾)~这下明白了吧,如果不明白,我还可以再换一种说法

我们所做的操作,就是从单向链表的某一个点一直走到尾结点。如果我们想合并两个链表,我们就将一种一条链表A的尾结点指向另一条链表B的任意节点

那么A的尾节点自然就变成了B的尾结点,只要能走到尾结点B的,我们即可判断他们已经连起来了。

实现这一个方法非常简单:

int c(int x)
{
    while(a[x]!=x)
    x=a[x];
    return x;
}

我们看,a[x]我们认为是x→next,假设开始所有节点都指向自己,如果x→next不指向自己,那么证明他不是车尾,我们继续往他的next走,直到

a[x]指向自己,我们返回x,这样就实现了 输入一个节点,返回其尾部的函数。

而连接操作,也很简单

x=c(x);
y=c(y);
if(x!=y)
a[x]=y;

就是我们所说的让其尾部指向另一个尾部即可(指向其他节点也可以,不过那样会影响搜索效率,因为尾部是树根,我们当然希望树的深度越小越好)

最终 再说一下判断当前有多少颗未连接的集合

直接看有几个树根(a[i]=i)就好啦~

int q=0;
         for(i=1;i<=n;i++)
         if(a[i]==i)
         q++;

完整代码:

#include<stdio.h>
int a[1001];
int c(int x)
{while(a[x]!=x)x=a[x];return x;
}int main()
{int i,n,m,x,y;while(scanf("%d%d",&n,&m)!=EOF){if(n==0) break;for(i=1;i<=n;i++)a[i]=i;while(m--){scanf("%d%d",&x,&y);x=c(x);y=c(y);if(x!=y)a[x]=y;}int q=0;for(i=1;i<=n;i++)if(a[i]==i)q++;printf("%d\n",q-1);}return 0;
}   

本篇博客讲的是自己初学是对并查集的理解,下篇博客将再进一步说明并查集的标准定义及应用

并查集——畅通工程(hdu1232)相关推荐

  1. 码说 | 并查集(以HDU1232为例)

    码说 | 并查集(以HDU1232为例) 欢迎大家关注Zane's平行光工作坊 并查集 题目如下 题意概括 解题思路 并查方法 具体代码 题毕 欢迎大家关注Zane's平行光工作坊 这是Zane第一次 ...

  2. HDU-1232 畅通工程

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

  3. HDU1232 畅通工程【并查集】

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

  4. hdu1232 畅通工程 (并查集)(浙师大OJ1307)

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

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

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...

  6. Hdu1232 畅通工程 【并查集】

    http://acm.hdu.edu.cn/showproblem.php?pid=1232 题目大意:有几个集合,问最少需要连几根线才能把这些集合并为一个集合. N个集合的话就需要N-1条路就行了, ...

  7. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

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

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

  9. 【HDU - 1863】 畅通工程(并查集+最小生成树)

    题干: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的 ...

最新文章

  1. 配置Tomcat监听80端口配置Tomcat虚拟主机Tomcat日志
  2. 头条搜索回应百度:不交钱也会保护品牌词搜索
  3. 关于布局管理器FlowLayout的思考:如何让FlowLayout自动换行(3)
  4. SCPPO(十):网站发布中的问题锦集—手动发布网站
  5. utilities(matlab)—— 图像分块(image2cols、cols2image)
  6. [2019CCPC网络赛][hdu6704]K-th occurrence(后缀数组主席树)
  7. mysql数据库增删改操作不自动提交事务
  8. 一个迅速崛起的国产开源OCR项目
  9. 条码软件如何制作SCC-14条形码
  10. 我“药水哥”硬气了 改行‘程序员’了
  11. 图片格式网页在线一键转换源码
  12. 2020年春季中国科大数字图像分析DIA考试试题回忆
  13. win10一键卸载所有自带应用
  14. Infortrend推出DaVinci Resolve媒资数据库集成
  15. 怎么校验一个数是否是素数(质数)以及如何更高效率的校验
  16. 三路测径仪同时测量三根铜丝的外径
  17. 【瑕疵检测】基于matlab GUI Gabor滤波布匹瑕疵检测【含Matlab源码 407期】
  18. 网络可视化如何提高企业绩效
  19. hbuilderX连接真机(荣耀8)
  20. android studio线性布局做计算器,Android studio设计简易计算器

热门文章

  1. STM32那点事(3)_中断(下)
  2. CUDA10.0+python3.6+pytorch1.2.0+torchvision0.4.0
  3. hasOwnProperty.call
  4. boot spring 怎么执行hql_Intellij如何使用Spring Boot正确配置hql。现在我得到持久性QL查询已进行错误检查...
  5. word删除分节符后之前的格式乱了_分页符分节符,你知道多少
  6. FLY主题1.4版本免费完全开源【EMLOG】
  7. php 中 excel表格判断,PHPexcel自动判断excel类型并读取excel所有sheet内容
  8. 电脑编程python和c加加语言的区别_小猿圈之Bash 和 Python 编程语言优缺点
  9. python离线语音识别_Python实现语音识别和语音合成功能
  10. 区块链JAVA数字交易所官方商业版开发级全套三端纯源码