HDU 1232 并查集/dfs
原题:
http://acm.hdu.edu.cn/showproblem.php?pid=1232
我的第一道并查集题目,刚刚学会,我是照着《啊哈算法》这本书学会的,感觉非常通俗易懂,另外还有一篇同样非常好的博客:http://blog.csdn.net/niushuai666/article/details/6662911
这两位大神已经把并查集讲解的非常透彻了,所以我就不班门弄斧了。。。
刚开始看到这道题的时候,我并不知道这里是怎么用到并查集的,可以说我对并查集的理解还不是很到位。看了上面那篇博文后才算有点明白了,并查集的本质就是维护一个森林,适合来解决一个图有几个连通分支的问题。
我刚开始是用深度优先搜索做的,和并查集的本质其实是一样的,就是先存储整个图,然后对每个节点进行深度优先搜索,这个每一次的搜索过程,就是对这个节点所扩展出的独立分支就行遍历,把所到之处的每一个节点进行标记,好下次不再访问已经访问过的节点。最后,我们统计总共进行深搜的次数,这就是对应着有几个独立的分支。当然,这个方法效率并不如并查集高,但也算是为大家提供了另一个思路吧(^_^)
深搜:
#include<stdio.h>
#include<string.h>
#define maxn 1005
int map[maxn][maxn],book[maxn];//map用来存储图,book是标记每个点是否已经访问过
int n,m;
void dfs(int cur){//cur表示当前节点
for(int i = ;i<=n;i++){
if(book[i]==&&map[cur][i]==){
book[i] = ;
dfs(i);
}
}
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
scanf("%d",&m);
memset(map,,sizeof(map));
memset(book,,sizeof(book));
for(int i = ;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
map[u][v] = ;
map[v][u] = ;
}
int sum = ;
for(int i = ;i<=n;i++){
if(book[i]==){
book[i] = ;//这句不要忘了,从当前节点开始搜索时,要标记
dfs(i);
sum++;
}
}
printf("%d\n",sum-);
}
return ;
}
我又用新学到的并查集来写了这道题(代码用了《啊哈算法》里的模板),算是一道非常好的并查集入门题吧~
#include<stdio.h>
#define maxn 1005
int n,m;
int f[maxn];
int getf(int a){
if(f[a]==a){
return a;
}else{
f[a] = getf(f[a]);
return f[a];
}
}
//合并函数
void merge(int u,int v){
int t1 = getf(u);
int t2 = getf(v);
if(t1!=t2)
f[t2] = t1;
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
scanf("%d",&m);
//初始化每个节点
for(int i = ;i<=n;i++)
f[i] = i;
for(int i = ;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
merge(u,v);
}
int sum = ;
for(int i = ;i<=n;i++)
if(f[i]==i)
sum++;
printf("%d\n",sum-);
}
return ;
}
HDU 1232 并查集/dfs的更多相关文章
- HDU 1232 并查集板子题
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- HDU 1232 - 并查集 解题报告
畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1232 并查集
畅通工程 Time ...
- 畅通工程 HDU - 1232 并查集板子题
#include<iostream> #include<cstring> using namespace std; ; int p[N]; int find(int x) { ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- HDU 3926 并查集 图同构简单判断 STL
给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...
- HDU 4496 并查集 逆向思维
给你n个点m条边,保证已经是个连通图,问每次按顺序去掉给定的一条边,当前的连通块数量. 与其正过来思考当前这边会不会是桥,不如倒过来在n个点即n个连通块下建图,检查其连通性,就能知道个数了 /** @ ...
- hdu 1198 (并查集 or dfs) Farm Irrigation
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1198 有题目图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇 ...
- HDU 2860 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=2860 n个旅,k个兵,m条指令 AP 让战斗力为x的加入y旅 MG x旅y旅合并为x旅 GT 报告x旅的战斗力 ...
随机推荐
- Python基本数据类型之tuple
一.创建元组: ages = (11, 22, 33, 44, 55) ages = tuple((11, 22, 33, 44, 55)) 元组和列表几乎一样 元组的元素不可修改,但是元组元素的元素 ...
- 常见linux命令释义(第三天)
今天晚上看鸟哥的私房菜,边学边写笔记. 在linux中压缩大多是.tar, .tar.gz , .tgz, /gz, .bz2等. .gz 是通过gzip压缩的文件. .bz2 是通过bzip2压缩的 ...
- ecshop 远程图片本地化
define('IN_ECS', true); require(dirname(__FILE__) . '/includes/init.php'); $smarty->assign('siteD ...
- Servlet Request的 getInputStream() getReader() getParameter()
如果你知道了这三者的区别,请忽略 最近碰到了servlet对入参获取方式的处理问题,因为二方库处理不当,导致了获取不到入参的情况,之前也知道这三个方法不兼容,现简单介绍下 1.这三个获取入参的方法,是 ...
- oc必须知道的知识点
id数据类型 1.通用的指针类型 2.没有*号 3.使用id类型时,不能给对象的属性或成员变量进行赋值 4.可以对其发送任何(存在的)消息 import与@class的区别 1.import会包含 ...
- Java可变参数传递中可以接收多个对象
- JavaScript排序算法——堆排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Ubuntu——"xxx is not in the sudoers file.This incident will be reported" 错误解决方法
Ubuntu下普通用户用sudo执行命令时报如题所示错误,解决方法就是在/etc/sudoers文件里给该用户添加权限.如下: 1.切换到root用户下 2./etc/sudoers文件默认是只读的, ...
- ImageTragick Exploit & Fix
ImageMagick是一款广泛流行的图像处理软件,有无数的网站(国内国外都有)使用它来进行图像处理,本周二,ImageMagick披露出了一个严重的0day漏洞,此漏洞允许攻击者通过上传恶意构造的图 ...
- C-结构体、枚举
#include <stdio.h> //结构体:可以由多个不同类型的数据构成 int main() { struct Person { //里面的3个变量,可以称为是结构体的成员或者属性 ...