在 C++ 中检查有向图是否连通
c++server side programmingprogramming
要检查图的连通性,我们将尝试使用任何遍历算法遍历所有节点。 完成遍历后,如果有任何未访问的节点,则图未连通。
对于有向图,我们将从所有节点开始遍历以检查连通性。 有时一个边只能有外边而没有内边,因此该节点不会被任何其他起始节点访问。
在这种情况下,遍历算法是递归 DFS 遍历。
输入 −图的邻接矩阵
0 | 1 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 1 | 1 |
1 | 0 | 0 | 0 | |
0 | 1 | 0 | 0 |
输出 −该图已连通。
算法
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 << "图形未连接。"; }
输出
图形已连接。