bfs判断连通图(无向)

《bfs判断连通图(无向)》
图论中,连通图基于连通的概念。在一个
无向图 G 中,若从
顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的。如果 G 是
有向图,那么连接vi和vj的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。图的
连通性是图的基本性质。   严格定义(摘抄): 对一个图
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 }

 

    原文作者:fengsz
    原文地址: https://www.cnblogs.com/fengsz/p/6213982.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞