hdu 1232 畅通工程 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232
并查集入门题。最近在学并查集,它无非包括三个操作:make_set(x)、union_set(x, y)和find_set(x)。
make_set(x)的作用是使得每一个成员x自成一个只包含x的集合。
union_set(x, y)的作用是使x和y合并成为一个新的集合,确定x和y的连通性。
find_set(x)则是查找到x的祖先,这里用set[i]表示元素 i 的祖先,换句话说就是,包含x的集合(唯一)的代表,当然这个代表是集合中的某个成员。对于如何选择代表要具体问题具体分析,但是要注意,如果寻找某一动态集合的代表两次,且在两次之间不修改集合,那么两次得到的答案应该是相同的。
并查集主要是用于确定无向图中连通子图的个数。这条题目实质上就是找出非连通子图的个数,对应的结果就是最少还需要建设的道路数目。
#include <iostream>
using namespace std; const int maxn = ; int set[maxn]; int find_set(int x)
{
int t = x;
while (x != set[x])
{
x = set[x];
}
int j;
while (t != x) // 路径压缩,其实这里不用也行,它是为了处理元素很多或整棵树变为一条链的情况的,可以减少时间复杂度
{
j = set[t];
set[t] = x;
t = j;
}
return x;
} void union_set(int x, int y)
{
x = find_set(x);
y = find_set(y);
if (x != y)
set[x] = y;
} int main()
{
int i, n, m, c1, c2;
while (scanf("%d%d", &n, &m) != EOF && n)
{
for (i = ; i <= n; i++) // make_set(x)
{
set[i] = i;
}
for (i = ; i < m; i++)
{
scanf("%d%d", &c1, &c2);
union_set(c1, c2); // 把c1和c2合并成一个集合,确定它们是连通的
}
int cnt = -;
for (i = ; i <= n; i++) // 注意:cnt是从-1开始的。每个集合都有一个“代表”。假设如果只有一个集合,那么是不再需要建设道路的,至少要有两个代表,才需要建设一条道路
{
if (set[i] == i) // 每得到一个集合的代表,就需要建设一条路,只有一个集合的不需要建设道路!
cnt++;
}
printf("%d\n", cnt);
}
return ;
}
hdu 1232 畅通工程 解题报告的更多相关文章
- 【九度OJ】题目1028:继续畅通工程 解题报告
[九度OJ]题目1028:继续畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1028 题目描述: 省政府" ...
- 【九度OJ】题目1024:畅通工程 解题报告
[九度OJ]题目1024:畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅 ...
- 【九度OJ】题目1017:还是畅通工程 解题报告
[九度OJ]题目1017:还是畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1017 题目描述: 某省调查乡村交通 ...
- 【九度OJ】题目1012:畅通工程 解题报告
[九度OJ]题目1012:畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1012 题目描述: 某省调查城镇交通状况 ...
- HDU 1232 畅通工程(道路连接)(裸并查集)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1232 畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1232 畅通工程(并查集算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 畅通工程 Time Limit: 4000/2000 MS (Java/Others) M ...
- 题解报告:hdu 1232 畅通工程(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了 ...
- HDU 1232 畅通工程(模板——并查集)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1232 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出 ...
- HDU 1232(畅通工程)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定一具有N个节点的图和其边集,求其集合数量. [题目分析] 并查集经典题...其实就是创建好并查集就行了.. [算法流程] 于 ...
随机推荐
- ThinkPHP多表联合查询的常用方法
1.原生查询示例: $Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_t ...
- Dinic问题
问题:As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Offic ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- jsp学习(四)
JavaBean是一个可重复使用的软件组件,是遵循一定标准.用java语言编写的一个类,该类的一个实例称为一个JavaBean,简称bean. 它必须符合如下规范:1.必须有一个零参数的默认构造函数2 ...
- 【基础语法】a++与++a的区别
package com.on.learn.e2; /** * @author lj * 自增:a++与++a a++是指本行表达式不使用a自增后的值,++a是指本行开始就已经使用a自增后的值 * */ ...
- Beta版本——冲刺计划及安排
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- Mac OS下编写对拍程序
介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...
- UILable点击事件
UILabel *lLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 19, 105, 1)]; lLabel.backgroundColor ...
- gcc/g++ 参数
-static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么 动态连接库,就可以运行. -share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
- Ubuntu格式化分区时的一个小错误
admin@gpc:/$ sudo mkfs -t ext3 -c /dev/sdb1 mkfs.ext3: inode_size (128) * inodes_count (0) too big ...