判断一个图是否连通

简介: 个人总结一下: 总的来说,可以用DFS(O(v^2))和BFS(O(v+e))的思想都能实现,只要从一个点出发,然后判断是否能遍历完所有的点。还有就是Tarjan算法和GABOW算法,这个没研究过,据说很好用。

个人总结一下:

总的来说,可以用DFS(O(v^2))和BFS(O(v+e))的思想都能实现,只要从一个点出发,然后判断是否能遍历完所有的点。还有就是Tarjan算法和GABOW算法,这个没研究过,据说很好用。

 

实现办法一:用Floyd算法,时间复杂度为O(v^3),时间复杂度较大。

实现办法二:拓扑排序(多用于有向图)。

实现办法三:用BFS和visa[]标志数组,看看从一个点出发,是否能访问完所有的点。

实现办法四:用DFS,(思想和办法三相差无几,递归用while循环代替而已)核心代码如下:


用邻接链表表示的图

 1 void dfs(int s)
 2 {
 3       visit[s] = true;
 4       cnt++;
 5       node* p = vnode[s];
 6       for (;p; p = p->next)
 7       {
 8            if (!visit[p->v]) 
 9 
10                   dfs(p->v);
11       }
12       return;
13  }
14 
15 cnt为全局变量,当cnt与总结点数相等时,就连通。
16 
17 
18 
19 /*用了广度优先搜索的思想*/
20 bool Connectivity_BFS(MGraph m)
21 {
22  queue<int> q;
23  bool visa[MAX_VERTEX_NUM];//之前先初始化为false
24  int count=0;
25  memset(visa,0,sizeof(visa));
26  q.push(1);
27  while(!q.empty())
28  {
29   int v=q.front();
30   visa[v]=true;
31   q.pop();
32   count++;
33   for(int i=1;i<=m.vexnum;i++)//把与v连通并且没有被访问过的结点压进队列里面。
34   {
35    if(m.arc[v][i].weight)
36     if(!visa[i])
37     {
38      q.push(i);
39      visa[i]=true;//标志被访问过。
40     }
41   }
42  }
43  if(count==m.vexnum)//如果压进栈的结点个数刚好等于总结点的个数,则连通。
44   return true;
45  return false;
46 }

 

目录
相关文章
|
7月前
|
人工智能 算法 BI
【调和级数 并集查找】1627. 带阈值的图连通性
【调和级数 并集查找】1627. 带阈值的图连通性
|
6月前
|
存储 算法 Java
图像分析之连通组件标记算法
图像分析之连通组件标记算法
474 1
|
7月前
leetcode-1319:连通网络的操作次数
leetcode-1319:连通网络的操作次数
38 0
|
vr&ar
离散数学_十章-图 ( 5 ):连通性 - 下
离散数学_十章-图 ( 5 ):连通性 - 下
189 0
|
算法
哈密顿路径在图G中找出一条包含所有顶点的简单路径,该路径称为哈密顿路径(1)图G是非完全有向图,且图G不一定存在哈密顿路径; > (2)设计算法判断图G是否存在哈密顿路径,如果存在,输出一天哈密顿路径
哈密顿路径在图G中找出一条包含所有顶点的简单路径,该路径称为哈密顿路径(1)图G是非完全有向图,且图G不一定存在哈密顿路径; > (2)设计算法判断图G是否存在哈密顿路径,如果存在,输出一天哈密顿路径
155 0
7-170 列出连通集 (25 分)
7-170 列出连通集 (25 分)
120 0
7-201 列出连通集 (25 分)
7-201 列出连通集 (25 分)
116 0
7-5 列出连通集 (6 分)
7-5 列出连通集 (6 分)
89 0
|
缓存 算法 前端开发
关联线探究,如何连接流程图的两个节点
如果你用过流程图绘制工具,那么可能会好奇节点之间的连接线是如何计算出来的,跟随本文一起来探究一下吧。
415 0