首先要明确什么是连通图???

连通图:对于一个图来说,图中的任意一个点都能访问到所有的点,则说明该图连通

很明显,如果要判断一个图是否连通,则必须要从任意一个搜索一遍,判断是否到达了所有的点,则很快会想到DFS和BFS。但是用并查集去判断是否连通,这种思想去确实没有想到。

如果用并查集来判断确实可以加快速度。让自己对并查集又有了新的认识。同时并查集还可以判断一个图是否形成自回路。

用一道题来说明连通图的判断:

给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
输入:每组数据的第一行是两个整数n 和m(0< n <=1000)。n 表示图的顶点
数目,m 表示图中边的数目。如果n 为0 表示输入结束。随后有m 行数据,每
行有两个值x 和y(0<x, y <=n),表示顶点x 和y 相连,顶点的编号从1 开始计
算。输入不保证这些边是否重复。
输出:对于每组输入数据,如果所有顶点都是连通的,输出 ’YES’ ,否则输
出 ’NO’。
===样例输入===
4 3
1 2
2 3
3 2
3 2
1 2
2 3
0 0
===样例输出===
NO

YES

并查集:首先任选一点,判断他是否可以到达其他各点,利用路径压缩,使得并查集更高效。

以图为例:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>using namespace std;const int maxn = 1e6+5;
int pre[maxn];int n, m;int find(int x){if(pre[x] == x) return x;else return pre[x] = find(pre[x]);
}int main()
{for(int i = 1; i <= maxn; i++) pre[i] = i;scanf("%d%d", &n, &m);for(int i = 0; i < m; i++){int u, v;scanf("%d%d", &u, &v);int fx = find(u), fy = find(v);pre[fx] = fy;}int cnt = 0;for(int i = 1; i <= n; i++){if(pre[i] == i) cnt++;}if(cnt == 1) printf("Yes\n");else printf("No\n");return 0;
}

用DFS进行搜索,在搜索的时候边搜索边把已搜过的路删掉


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>using namespace std;const int maxn = 1e6+5;vector<int>G[maxn];
bool vis[maxn];int n, m;void dfs(int x){vis[x] = true;for(int i = 0; i < G[x].size(); i++){if(vis[G[x][i]]) G[x].erase(G[x].begin() + i);else dfs(G[x][i]); }
}bool pan(){for(int i = 1; i <= n; i++){if(!vis[i]){return false;}}return true;
} int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < m; i++){int u, v;scanf("%d%d", &u, &v);G[u].push_back(v);G[v].push_back(u);}memset(vis, false, sizeof(vis));dfs(1);        //从第一个点开始搜if(pan()) printf("Yes\n");else printf("No\n");return 0;
} 

用BFS进行遍历,用到队列,对这一部分还应加强学习

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<vector>using namespace std;
const int maxn = 1e6+5;vector<int>G[maxn];
int vis[maxn];int n, m;void bfs(int x){queue<int>Q;Q.push(x);while(!Q.empty()){int t = Q.front();Q.pop();vis[t] = true;for(int i = 0; i < G[t].size(); i++){if(vis[G[t][i]]) G[t].erase(G[t].begin() + i);else Q.push(G[t][i]);}}
} bool pan(){for(int i = 1; i <= n; i++){if(!vis[i]) return false; }return true;
}int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < m; i++){int u, v;scanf("%d%d", &u, &v);G[u].push_back(v);G[v].push_back(u); }memset(vis, false, sizeof(vis));bfs(1);if(pan()) printf("Yes\n");else printf("No\n");return 0;
}

连通图的判断(并查集, DFS, BFS)相关推荐

  1. HDU1181:变形课(并查集 + DFS + BFS)

    变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submissi ...

  2. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  3. 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...

    hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...

  4. UVA - 208 Firetruck(并查集+dfs)

    题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...

  5. zoj 3761 Easy billiards 并查集+dfs

    生活真是奇妙的东西,这样的题目居然能被联想到这样的算法,只能说智商不够啊. 这道题目的意思不解释了,月赛的时候我队友已经想出来了做法,但是我们最后还是没A. 题解: 1.首先将所有能连接的球连接起来, ...

  6. [COCI2017-2018#5] Pictionary(并查集+dfs)

    贼ex的一道,卡了本仙女整整7个小时orz 思路容易理解,but码力very重要orz 我愿意花五毛钱提升我的码力,换个脑子也行,不换脸这张脸生得俊俏 luogu传送door 题目 在宇宙一个不为人知 ...

  7. 【2019浙江省赛 - J】Welcome Party(并查集,bfs,优先队列,建图)

    题干: The 44th World Finals of the International Collegiate Programming Contest (ICPC 2020) will be he ...

  8. 【51Nod - 1416】两点 (dfs 或 并查集+dfs)

    题干: 福克斯在玩一款手机解迷游戏,这个游戏叫做"两点".基础级别的时候是在一个n×m单元上玩的.像这样:     每一个单元有包含一个有色点.我们将用不同的大写字母来表示不同的颜 ...

  9. Multiplayer Moo[ [ 并查集+dfs连通块 ] / [ dfs ] ]

    题目链接 题目描述: The cows have come up with a creative new game, surprisingly giving it the least creative ...

  10. Oil Deposits HDU - 1241 并查集思想 + bfs搜索

    题目 在第一次植物僵尸世界大战中,植物国的黑玫瑰王子使用了植物国的超超超超级无敌禁术-----"BUG",开启了异次元的大门,在一位超超超超-级的指挥官"辅助器" ...

最新文章

  1. 20155321 实验四 Android程序设计
  2. Matlab数据的可视化 -- 柱形立体图
  3. 零基础入门学习Python(33)-图形用户界面编程(GUI编程)EasyGui
  4. 哈佛图书馆墙上的训言
  5. c语言精炼pdf,发计算机二级C语言多年精炼笔试试卷.pdf
  6. Cloud for Customer的shell布局介绍
  7. 【C# 调用 Go 语言】0x1 Hello Golang
  8. Spring Integration Java DSL示例–使用Jms名称空间工厂进一步简化
  9. 【渝粤教育】电大中专测量学作业 题库
  10. python系列(四)python元组与字典
  11. android 点滴积累
  12. apiclod 上传图片_apiCloud图片选择、处理、上传模块
  13. Linux中如何恢复rm命令误删除的文件之extundelete编译安装及使用
  14. 矩阵论第二章总结:范数理论及应用(脑图)
  15. Ubuntu 16.04 安装Matlab R2015b
  16. ios7 下载企业版
  17. 太阳天顶角与太阳方位角计算
  18. 完美解决VMware安装后没有VMnet1和VMnet8的问题
  19. 非共识与小趋势——复盘罗辑思维7年演化之路
  20. 新品再续传奇 九联科技AX1800 WIFI6路由器上市受追捧

热门文章

  1. python中字符串编码转换
  2. 服务器的攻与防(firewall 禁止指定Ip)
  3. 学习scala的网站汇总
  4. VisualSVN安装配置与使用
  5. 5月23日任务 LAMP架构介绍、MySQL、MariaDB介绍、 MySQL安装
  6. JS中点语法和方括号语法访问属性的区别
  7. 利用ImageMagick命令执行漏洞拿下Facebook四万美元奖金
  8. 家庭安全摄像头:应选择本地还是云端存储?
  9. maven上传本地仓库
  10. 自定义获取html元素对象的7种方法。