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

 

原题目链接:http://hdu.hustoj.com/showproblem.php?pid=1232

并查集:并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。(取自360百科)

虽然这题用我们以前的暴力也能解题,但是到数据过大的时候会超时,所以此处就考虑到了时间复杂度,所以要用并查集,大大的减少了输出答案所需要的时间。

该题其实很简单,应该算是并查集的入门题吧。

题目, 比如样例:

5 2 (n=5,m=2)

1 2 城镇1 2相连

3 5 城镇3 5相连 那么(1,2) (3,5) (4) 总共有3个集合,集合数目-1就是答案。

又比如说 1,3相连 3,5相连 5,7相连 3.9相连

用通俗的说法 3的父亲是1 5的父亲是3,5的爷爷是1, 7的父亲是5.....后面所有的与该相通的祖宗都是同一个。然后再后面的步骤中,将同一个祖宗的城镇,改值。

贴上代码:

#include<stdio.h>
int bin[1010];
int findx(int x)
{
int r=x;
while (bin[r]!=r)             //改变原城镇的初始值
r=bin[r];
return r;
}
void merge(int x,int y)
{
int fx,fy;
fx=findx(x);
fy=findx(y);
if (fx!=fy)
bin[fx]=fy;
}
int main()
{
int n,m,x,y,i,ans;
while (scanf("%d%d",&n,&m)&&n)
{
for (i=1;i<=n;i++)              //对城镇初始化
bin[i]=i;
if (m==0)   
printf ("%d\n",n-1);
else{
for (;m>0;m--){
scanf ("%d%d",&x,&y);
merge(x,y);
}
for (ans=0,i=1;i<=n;i++)
if (bin[i]==i)               // 计数 有几个城镇集合
ans++;
printf ("%d\n",ans-1);
}
}
return 0;
}

最新文章

  1. ORACLE 常见错误
  2. Harp – 内置常用预处理器的静态 Web 服务器
  3. javascript 返回字符长度,中文为两个字节,英文为一个字节
  4. css3很酷的加载动画多款
  5. 64位Linux编译hadoop-2.5.1
  6. MySQL &#183; 特性分析 &#183; innodb 锁分裂继承与迁移
  7. Swift - 22 - 循环结构
  8. js中冒泡事件
  9. 【IP限制】验证是否限制了境外IP访问权限
  10. zookeeper命令行操作
  11. Linux编程之内存池的设计与实现(C++98)
  12. 02_ if_else if 练习
  13. xlistview长按
  14. SpringBoot集成Freemarker与Thymeleaf
  15. Tomcat延迟启动
  16. aliplayer 视频播放报错
  17. Atitit.mysql 5.0 5.5 &#160;5.6 5.7 &#160;新特性 新功能
  18. serclet监听器
  19. PHP和MySQL实现消息队列
  20. PHP面试系列 之框架(一)---- MVC框架基本工作原理

热门文章

  1. Simotion CF卡 固件下载地址及制作方法
  2. May 24th 2017 Week 21th Wednesday
  3. Ubuntu下Qt(Retex)无法输入中文
  4. What is a Thread?
  5. Gym
  6. POJ 2195 Going Home 【二分图最小权值匹配】
  7. Cesium.js学习第一天(设置材质)
  8. C++工程文件夹中的bin和obj文件夹有何用处?(补充多文件结构)
  9. Angularjs 数据循环
  10. gcc扩展语法一:在表达式中的语句和声明