使用Java实现深度优先搜索(DFS)求最短距离
在开发中,图的遍历是一项常见的需求,尤其是在许多算法中,深度优先搜索(DFS)是一种重要的方法。在本文中,我将向你介绍如何使用Java实现DFS算法来找出最短距离。我们将分步骤来完成这个任务,即使你是刚入门的开发者,也可以轻松理解。
流程概述
在实现DFS之前,我们先来看看整个流程。下表展示了实现DFS求最短距离的步骤:
步骤 | 描述 |
---|---|
1 | 创建图的邻接表表示 |
2 | 实现DFS算法 |
3 | 计算每个节点的最短距离 |
4 | 输出结果 |
接下来,我们将逐步详细解释每一步需要做的事情。
步骤一:创建图的邻接表表示
我们首先需要定义一个图的结构,这里我们用邻接表来表示图。邻接表适合稀疏图的存储。
import java.util.*;
class Graph {
private Map<Integer, List<Integer>> adjacencyList;
public Graph() {
adjacencyList = new HashMap<>();
}
// 添加边
public void addEdge(int source, int destination) {
adjacencyList.putIfAbsent(source, new ArrayList<>());
adjacencyList.putIfAbsent(destination, new ArrayList<>());
adjacencyList.get(source).add(destination);
adjacencyList.get(destination).add(source); // 因为是无向图
}
// 获取邻接表
public Map<Integer, List<Integer>> getAdjacencyList() {
return adjacencyList;
}
}
解释
- 我们定义了一个
Graph
类,包含一个Map
用于存储邻接表。 addEdge
方法用于添加边,建立起图中节点的连接。
步骤二:实现DFS算法
在这个步骤中,我们将实现深度优先搜索。为了找到最短路径,我们会在DFS中的每一步记录当前的路径长度。
class DFS {
private Set<Integer> visited;
private int shortestDistance;
public DFS() {
visited = new HashSet<>();
shortestDistance = Integer.MAX_VALUE;
}
public void dfs(Graph graph, int node, int distance) {
// 如果已访问该节点,返回
if (visited.contains(node)) return;
// 记录访问
visited.add(node);
// 如果达到终点,更新最短距离
if (node == targetNode) {
shortestDistance = Math.min(shortestDistance, distance);
return;
}
// 遍历邻接节点
for (int neighbor : graph.getAdjacencyList().getOrDefault(node, new ArrayList<>())) {
dfs(graph, neighbor, distance + 1); // 当前距离加一
}
// 结束访问,回溯
visited.remove(node);
}
// 获取最短距离
public int getShortestDistance() {
return shortestDistance;
}
}
解释
visited
集合用于记录已访问的节点,防止重复访问。shortestDistance
记录当前的最短距离。- 当我们深度遍历到终点节点时,更新最短距离。
- DFS采用递归方式遍历每个邻接节点。
步骤三:计算每个节点的最短距离
为了找到从起点到终点的最短距离,我们需要初始化DFS并开始搜索。
public class Main {
private static int targetNode = 4; // 假设终点是节点4
public static void main(String[] args) {
Graph graph = new Graph();
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(3, 4);
graph.addEdge(2, 3);
DFS dfs = new DFS();
dfs.dfs(graph, 1, 0); // 从节点1开始搜索
System.out.println("从节点1到节点" + targetNode + "的最短距离是:" + dfs.getShortestDistance());
}
}
解释
- 我们创建了图并添加了一些边。
- 实例化DFS对象并从起点(节点1)开始搜索。
- 输出从起点到终点的最短距离。
流程示意图
我们可以使用mermaid
语法来展示旅行图的过程:
journey
title DFS Travel to Find Shortest Path
section Start
Start at Node 1: 5: Node 1
section Traverse
Visit Node 2: 4: Node 2
Visit Node 4: 3: Node 4
section Backtrack
Back to Node 2: 2: Node 2
Back to Node 1: 1: Node 1
section Travel to Target
Visit Node 3: 1: Node 3
Visit Node 4: 0: Node 4
类图
现在,我们可以使用mermaid
语法展示类图:
classDiagram
class Graph {
+Map<Integer, List<Integer>> adjacencyList
+void addEdge(int source, int destination)
+Map<Integer, List<Integer>> getAdjacencyList()
}
class DFS {
+Set<Integer> visited
+int shortestDistance
+void dfs(Graph graph, int node, int distance)
+int getShortestDistance()
}
总结
在这篇文章中,我们通过Java实现了深度优先搜索(DFS)算法来计算给定起点到终点的最短距离。首先,我们创建了图的邻接表表示,然后实现了DFS算法,最后计算并输出最短距离。希望这篇文章对你理解DFS有所帮助,你可以将这些知识运用到你的项目中!
如果你有任何疑问,欢迎你询问,持续学习编程的旅程总会充满乐趣!