在有向图中找到两个顶点之间是否存在路径

2023年 8月 29日 89.3k 0

在有向图中找到两个顶点之间是否存在路径

在计算机科学和图论中,解决各种现实生活模型场景的方案严重依赖于有向图。这些专门的图由通过指向其他顶点的有向边连接的顶点组成。确定两个指定点之间是否存在路径是使用有向图的一个典型难题。在本文中,我们将探讨使用C++解决这个困境的各种方法,包括每个过程所需的语法,以确保事情易于理解。此外,我们将详细介绍精心说明每种方法的算法,并包含两个可执行的代码示例。

语法

在深入了解具体细节之前,理解支撑这里方法论的语言结构是至关重要的。因此,在继续查看代码示例之前,让我们首先检查这个语法。

bool isPathExists(int startVertex, int endVertex, const vector& graph);

登录后复制

算法

在有向图中找到两个顶点之间的路径可以使用多种技术来解决。本文将重点讨论两种广泛使用的方法−

方法一:深度优先搜索(DFS)

  • 创建一个visited数组来在遍历过程中跟踪已访问的顶点。

  • 将visited数组的所有元素初始化为false。

  • 将startVertex标记为已访问。

  • 如果起始顶点与结束顶点相同,则返回true,表示存在一条路径。

  • 对于当前顶点的每个相邻顶点,以相邻顶点作为新的起始顶点,递归调用isPathExists函数。

  • 如果任何递归调用返回true,则返回true。

  • 如果没有递归调用返回true,则返回false。

方法二:广度优先搜索(BFS)

  • 创建一个visited数组来在遍历过程中跟踪已访问的顶点。

  • 将visited数组的所有元素初始化为false。

  • 创建一个队列来存储待处理的顶点。

  • 将startVertex加入队列,并标记为已访问。

  • 如果队列不为空,执行以下操作:

  • 从队列中出队一个顶点。

  • 如果出队的顶点与endVertex相同,则返回true,表示存在一条路径。

  • 对于每个被出队的顶点的相邻顶点,如果它尚未被访问,则将其入队并标记为已访问。

  • 如果队列变为空并且没有找到路径,则返回 false。

示例1:深度优先搜索(DFS)方法

#include
#include
using namespace std;

bool isPathExists(int startVertex, int endVertex, const vector& graph) {
vector visited(graph.size(), false);
visited[startVertex] = true;

if (startVertex == endVertex)
return true;

for (int adjVertex : graph[startVertex]) {
if (!visited[adjVertex] && isPathExists(adjVertex, endVertex, graph))
return true;
}

return false;
}

int main() {
// Example usage
int numVertices = 6;
vector graph(numVertices);
graph[0] = {1, 2};
graph[1] = {3};
graph[2] = {1};
graph[3] = {4, 5};
graph[4] = {};
graph[5] = {4};

int startVertex = 0;
int endVertex = 5;

if (isPathExists(startVertex, endVertex, graph))
cout

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论