连通图的判断(并查集, DFS, BFS)
首先要明确什么是连通图???
连通图:对于一个图来说,图中的任意一个点都能访问到所有的点,则说明该图连通
很明显,如果要判断一个图是否连通,则必须要从任意一个搜索一遍,判断是否到达了所有的点,则很快会想到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
===样例输出===
NOYES
并查集:首先任选一点,判断他是否可以到达其他各点,利用路径压缩,使得并查集更高效。
以图为例:
#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)相关推荐
- HDU1181:变形课(并查集 + DFS + BFS)
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submissi ...
- 求树的直径+并查集(bfs,dfs都可以)hdu4514
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...
- 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...
hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...
- UVA - 208 Firetruck(并查集+dfs)
题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...
- zoj 3761 Easy billiards 并查集+dfs
生活真是奇妙的东西,这样的题目居然能被联想到这样的算法,只能说智商不够啊. 这道题目的意思不解释了,月赛的时候我队友已经想出来了做法,但是我们最后还是没A. 题解: 1.首先将所有能连接的球连接起来, ...
- [COCI2017-2018#5] Pictionary(并查集+dfs)
贼ex的一道,卡了本仙女整整7个小时orz 思路容易理解,but码力very重要orz 我愿意花五毛钱提升我的码力,换个脑子也行,不换脸这张脸生得俊俏 luogu传送door 题目 在宇宙一个不为人知 ...
- 【2019浙江省赛 - J】Welcome Party(并查集,bfs,优先队列,建图)
题干: The 44th World Finals of the International Collegiate Programming Contest (ICPC 2020) will be he ...
- 【51Nod - 1416】两点 (dfs 或 并查集+dfs)
题干: 福克斯在玩一款手机解迷游戏,这个游戏叫做"两点".基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不同的大写字母来表示不同的颜 ...
- Multiplayer Moo[ [ 并查集+dfs连通块 ] / [ dfs ] ]
题目链接 题目描述: The cows have come up with a creative new game, surprisingly giving it the least creative ...
- Oil Deposits HDU - 1241 并查集思想 + bfs搜索
题目 在第一次植物僵尸世界大战中,植物国的黑玫瑰王子使用了植物国的超超超超级无敌禁术-----"BUG",开启了异次元的大门,在一位超超超超-级的指挥官"辅助器" ...
最新文章
- 20155321 实验四 Android程序设计
- Matlab数据的可视化 -- 柱形立体图
- 零基础入门学习Python(33)-图形用户界面编程(GUI编程)EasyGui
- 哈佛图书馆墙上的训言
- c语言精炼pdf,发计算机二级C语言多年精炼笔试试卷.pdf
- Cloud for Customer的shell布局介绍
- 【C# 调用 Go 语言】0x1 Hello Golang
- Spring Integration Java DSL示例–使用Jms名称空间工厂进一步简化
- 【渝粤教育】电大中专测量学作业 题库
- python系列(四)python元组与字典
- android 点滴积累
- apiclod 上传图片_apiCloud图片选择、处理、上传模块
- Linux中如何恢复rm命令误删除的文件之extundelete编译安装及使用
- 矩阵论第二章总结:范数理论及应用(脑图)
- Ubuntu 16.04 安装Matlab R2015b
- ios7 下载企业版
- 太阳天顶角与太阳方位角计算
- 完美解决VMware安装后没有VMnet1和VMnet8的问题
- 非共识与小趋势——复盘罗辑思维7年演化之路
- 新品再续传奇 九联科技AX1800 WIFI6路由器上市受追捧