bfs判断连通图(无向)
严格定义(摘抄):
对一个图 G=(V,E) 中的两点 x 和 y ,若存在交替的顶点和边的序列
Γ=(x=v0-e1-v1-e2-...-ek-(vk+1)=y) (在有向图中要求有向边vi−( vi+1)属于E ),则两点 x 和 y 是连通的。Γ是一条x到y的连通路径,x和y分别是起点和终点。当 x = y 时,Γ 被称为回路。如果通路 Γ 中的边两两不同,则 Γ 是一条简单通路,否则为一条复杂通路。如果图 G 中每两点间皆连通,则 G 是连通图。
基本方法:
简单的随便从一个点开始bfs,每遍历到一个点都将那个点打好标记,并且统计个数,在bfs退出以后比较统计的连通的点的个数是否等于我们的节点个数,等于则是连通图,不等则不是连通图。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 7 const int maxn = 1000 + 5; 8 9 int n,m; 10 int my_index; 11 12 vector<int >G[maxn]; 13 bool vis[maxn]; 14 15 void bfs(int u){ 16 queue<int >Q; 17 Q.push(u); 18 while(!Q.empty()){ 19 int s = Q.front();Q.pop(); 20 vis[s] = true; 21 my_index++; 22 for(int i = 0;i < G[s].size(); i++){ 23 int v = G[s][i]; 24 if(!vis[v])Q.push(v); 25 } 26 } 27 } 28 29 int main(){ 30 scanf("%d%d",&n,&m); 31 for(int i = 1;i <= m; i++){ 32 int a,b; 33 scanf("%d%d",&a,&b); 34 G[a].push_back(b);
G[b].push_back(a); 35 } 36 bfs(1); 37 if(my_index == n)printf("Yes\n"); 38 else printf("No\n"); 39 }