📅  最后修改于: 2023-12-03 15:26:38.519000             🧑  作者: Mango
有向图是顶点和有向边构成的结构,其中顶点表示节点,有向边表示节点之间的方向性关系。在有向图中,如果从一个顶点 u 出发可以到达另一个顶点 v,则称 u 是 v 的前驱,v 是 u 的后继。如果存在一条从顶点 u 到顶点 v 的路径,则称顶点 v 是从顶点 u 可达的。
在这篇文章中,我们将介绍两种查找有向图中两个顶点之间是否存在路径的算法。第一种算法是深度优先搜索,第二种算法是广度优先搜索。
深度优先搜索是一种常用的算法,用于遍历图或树。在这里我们介绍使用深度优先搜索来查找有向图中两个顶点之间是否存在路径的算法。该算法使用深度优先搜索遍历整个有向图,并使用一个布尔数组记录每个顶点的状态(已访问或未访问),每次搜索时都会对当前顶点的所有未访问子节点进行递归搜索。如果搜索到目标顶点,则表示有路径存在,否则表示不存在路径。
以下是使用深度优先搜索查找有向图中两个顶点之间是否存在路径的代码片段:
public boolean hasPathDFS(int u, int v) {
boolean[] visited = new boolean[n];
return dfs(u, v, visited);
}
private boolean dfs(int u, int v, boolean[] visited) {
if (u == v) return true;
visited[u] = true;
for (int i = 0; i < n; i++) {
if (!visited[i] && graph[u][i] == 1) {
if (dfs(i, v, visited)) return true;
}
}
return false;
}
其中,u 和 v 分别是起点和终点的顶点编号,graph 是一个邻接矩阵数组,表示有向图的结构,n 是顶点数量。
广度优先搜索也是一种常用的算法,用于搜索图或树中的元素。在这里我们介绍使用广度优先搜索来查找有向图中两个顶点之间是否存在路径的算法。该算法使用队列数据结构来存储待处理的顶点,每次从队列中取出一个顶点,并将它的所有邻居加入队列中,如果找到目标顶点则表示有路径存在,否则一直处理队列中的元素直至队列为空。
以下是使用广度优先搜索查找有向图中两个顶点之间是否存在路径的代码片段:
public boolean hasPathBFS(int u, int v) {
boolean[] visited = new boolean[n];
Queue<Integer> queue = new LinkedList<>();
visited[u] = true;
queue.offer(u);
while (!queue.isEmpty()) {
int curr = queue.poll();
if (curr == v) return true;
for (int i = 0; i < n; i++) {
if (!visited[i] && graph[curr][i] == 1) {
visited[i] = true;
queue.offer(i);
}
}
}
return false;
}
其中,u 和 v 分别是起点和终点的顶点编号,graph 是一个邻接矩阵数组,表示有向图的结构,n 是顶点数量。