在 C++ 中检查有向图是否连通

c++server side programmingprogramming

要检查图的连通性,我们将尝试使用任何遍历算法遍历所有节点。 完成遍历后,如果有任何未访问的节点,则图未连通。

对于有向图,我们将从所有节点开始遍历以检查连通性。 有时一个边只能有外边而没有内边,因此该节点不会被任何其他起始节点访问。

在这种情况下,遍历算法是递归 DFS 遍历。

输入 −图的邻接矩阵

01000
00100
00011
1000
0100

输出 −该图已连通。

算法

traverse(u, accessed)
输入:起始节点 u 和已访问节点,标记哪个节点已访问。
输出:遍历所有连通的顶点。
开始
   将 u 标记为已访问
   对于所有顶点 v,如果它与 u 相邻,则执行
      如果 v 未被访问,则
        traverse(v, accessed)
    完成
结束
isConnected(graph)
输入:图。
输出:如果图已连通,则为 True。
开始
   定义已访问数组
   对于图中的所有顶点 u,执行
      使所有节点都未访问
      traverse(u, accessed)
      如果仍有任何未访问的节点,则
         返回 false
   完成
   返回 true
结束

示例

#include<iostream>
#define NODE 5
using namespace std;
int graph[NODE][NODE] = {{0, 1, 0, 0, 0},
   {0, 0, 1, 0, 0},
   {0, 0, 0, 1, 1},
   {1, 0, 0, 0, 0},
   {0, 1, 0, 0, 0}
};
void traverse(int u, bool visited[]){
   visited[u] = true; //将 v 标记为已访问
   for(int v = 0; v<NODE; v++){
      if(graph[u][v]){
          if(!visited[v])
         traverse(v, accessed);
      }
   }
}
bool isConnected(){
   bool *vis = new bool[NODE];
   //对于所有以 u 为起点的顶点,检查所有节点是否可见
   for(int u; u < NODE; u++){
      for(int i = 0; i<NODE; i++)
      vis[i] = false; //初始化为未访问任何节点
      traverse(u, vis);
      for(int i = 0; i<NODE; i++){
          if(!vis[i]) //如果存在未被遍历访问的节点,则图未连通
         返回 false;
      }
   }
   return true;
}
int main(){
   if(isConnected())
   cout << "图形已连接。";
   else
    cout << "图形未连接。";
}

输出

图形已连接。

相关文章