图寻路算法详解:基于深度优先搜索 (DFS) 的 Java 实现
图的寻路算法是图论中的基础应用之一,核心目标是在网络中找到从起点到终点的路径。深度优先搜索(DFS)作为一种经典策略,沿着图的深度方向尽可能远地探索,非常适合用于判断连通性或寻找任意一条可行路径。
一、算法核心思想
要实现 DFS 寻路,关键在于记录遍历过程中的状态。我们主要依赖两个数组:
- visited 数组:标记顶点是否已被访问,防止死循环和重复计算。
- from 数组:记录路径中每个顶点的前驱节点。一旦找到目标,通过该数组逆向回溯即可还原完整路径。
这种设计使得算法在遍历的同时隐式地构建了路径树,无需额外的复杂结构。
二、数据结构与实现细节
1. 核心类设计
我们需要一个 Path 类来封装寻路逻辑。它持有图的引用,并在初始化时立即执行一次完整的 DFS 遍历,将结果缓存起来供后续查询。
import java.util.Stack;
import java.util.Vector;
/**
* 基于 DFS 的寻路算法
*/
public class Path {
private Graph G; // 图的引用
private int s; // 起始点
private boolean[] visited;// 记录访问过的节点
private int[] from; // 记录路径,from[i]表示 i 的前驱节点
// 构造函数,寻路算法
public Path(Graph graph, int s) {
G = graph;
assert s >= 0 && s < G.V();
visited = new boolean[G.V()];
from = new int[G.V()];
for (int i = 0; i < G.V(); i++) {
visited[i] = false;
from[i] = -1;
}
.s = s;
dfs(s);
}
{
visited[v] = ;
( i : G.adj(v)) {
(!visited[i]) {
from[i] = v;
dfs(i);
}
}
}
{
w >= && w < G.V();
visited[w];
}
Vector<Integer> {
;
Stack<Integer> stack = <>();
w;
(p != -) {
stack.push(p);
p = from[p];
}
Vector<Integer> res = <>();
(!stack.empty()) res.add(stack.pop());
res;
}
{
;
Vector<Integer> vec = path(w);
( ; i < vec.size(); i++) {
System.out.print(vec.elementAt(i));
(i != vec.size() - )
System.out.print();
}
System.out.println();
}
}


