HDU 1232 畅通工程
畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 50540 Accepted Submission(s): 26968
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
Hint
Hint
Huge input, scanf is recommended.
Source
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232
分析:并查集的经典题啊!这题的主要思想在于:找出连通分量的个数。减一之后就是所求最小需要添加的路径数。而利用并查集时可以发现连通
分量的个数等于父节点为自身的节点数目。
下面给出AC代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 int pre[1010];
4 bool t[1010];//t 用于标记独立块的根结点
5 int find(int x)//查找根节点
6 {
7 int r=x;
8 while(pre[r]!=r)
9 r=pre[r];//返回根节点 r
10 int i=x,j;
11 while(pre[i]!=r)//路径压缩
12 {
13 j=pre[i]; // 在改变上级之前用临时变量 j 记录下他的值
14 pre[i]=r;//把上级改为根节点
15 i=j;
16 }
17 return r;
18 }
19 void join(int x,int y)//判断x y是否连通,
20 {
21 int fx=find(x),fy=find(y);
22 if(fx!=fy)
23 pre[fy]=fx;//如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起来
24 }
25 int main()
26 {
27 int N,M,a,b,i,j,ans;
28 while(scanf("%d%d",&N,&M)&&N)
29 {
30 for(i=1;i<=N;i++)
31 pre[i]=i;//初始化
32 for(i=1;i<=M;i++)
33 {
34 scanf("%d%d",&a,&b);
35 join(a,b);//判断x y是否连通
36 }
37 memset(t,0,sizeof(t));
38 for(i=1;i<=N;i++)
39 t[find(i)]=1;//标记根结点
40 for(ans=0,i=1;i<=N;i++)
41 if(t[i])
42 ans++;
43 printf("%dn",ans-1);
44 }
45 return 0;
46 }
- c++ fstream + string 处理大数据
- 超炫的FlowingDrawer效果
- 源码分享:仿余额宝数字跳动效果 TextCounter
- 一键清理应用数据或者清除应用缓存的方法
- 开发者必知:谷歌做了一个艰难的决定
- React编程思想
- 基于 React + Webpack 的音乐相册项目(下)
- Python中Keras深度学习库的回归教程
- Apache Spark 1.1中的统计功能
- 一次关闭所有Activity和连续点击两次返回键关闭程序的方法
- 解决TextView排版混乱或者自动换行的问题
- 怎样设置EditText内部文字被锁定不可删除和修改,而文字只能在后面输入
- 教你如何使用微信网页版“抓取”微信撤回消息
- 移动开发之实现图片轮播效果
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法