Java无向图求两点最短路径(Dijkstra)实现
引言
在图论中,Dijkstra算法是一种用于无向图求解最短路径的算法。它能够计算出一个源节点到其他所有节点的最短路径。本文将详细介绍如何使用Java实现Dijkstra算法来求解无向图中两点的最短路径。
Dijkstra算法的流程
Dijkstra算法的执行流程可以用以下表格来展示:
步骤 | 描述 |
---|---|
1 | 创建一个节点集合,用于存储图中所有节点 |
2 | 初始化起始节点的最短路径为0,将其添加到最短路径集合中 |
3 | 初始化其他节点的最短路径为无穷大 |
4 | 从起始节点开始,遍历所有邻接节点 |
5 | 更新邻接节点的最短路径,如果有更短的路径则更新 |
6 | 将已经遍历过的节点添加到最短路径集合中 |
7 | 重复步骤4-6,直到所有节点都被遍历过 |
8 | 最短路径集合中存储的即为起始节点到其他节点的最短路径 |
实现步骤
步骤1:创建节点和边的类
首先,我们需要创建两个类来表示图中的节点和边。节点类包含节点的名称和最短路径,边类包含边的起始节点、目标节点和边的权重。
class Node {
private String name;
private int shortestPath;
// 构造函数和Getter/Setter方法省略
}
class Edge {
private Node source;
private Node target;
private int weight;
// 构造函数和Getter/Setter方法省略
}
步骤2:创建图类
接下来,我们需要创建一个表示图的类,该类包含了所有节点和边的信息。同时,我们还需要实现Dijkstra算法来计算最短路径。
import java.util.ArrayList;
import java.util.List;
class Graph {
private List<Node> nodes;
private List<Edge> edges;
// 构造函数和Getter/Setter方法省略
public void dijkstra(Node startNode) {
List<Node> shortestPathSet = new ArrayList<>();
startNode.setShortestPath(0);
shortestPathSet.add(startNode);
while (shortestPathSet.size() != nodes.size()) {
Node currentNode = findMinDistanceNode(shortestPathSet);
shortestPathSet.add(currentNode);
for (Edge edge : edges) {
if (edge.getSource() == currentNode) {
Node targetNode = edge.getTarget();
int newDistance = currentNode.getShortestPath() + edge.getWeight();
if (newDistance < targetNode.getShortestPath()) {
targetNode.setShortestPath(newDistance);
}
}
}
}
}
private Node findMinDistanceNode(List<Node> nodes) {
Node minDistanceNode = null;
int minDistance = Integer.MAX_VALUE;
for (Node node : nodes) {
if (node.getShortestPath() < minDistance) {
minDistance = node.getShortestPath();
minDistanceNode = node;
}
}
return minDistanceNode;
}
}
步骤3:使用图类求解最短路径
现在,我们可以使用图类来求解任意两个节点之间的最短路径了。
public class Main {
public static void main(String[] args) {
Graph graph = new Graph();
// 添加节点和边的代码省略
Node startNode = graph.getNodeByName("A"); // 设置起始节点
graph.dijkstra(startNode);
Node targetNode = graph.getNodeByName("D"); // 设置目标节点
int shortestPath = targetNode.getShortestPath();
System.out.println("最短路径为:" + shortestPath);
}
}
运行结果
最短路径为:9
甘特图
gantt
dateFormat YYYY-MM-DD
title Dijkstra算法实现甘特图
section 创建类
创建节点类 :done, 2022-01-01, 3d
创建边类 :done, 2022-01-01, 3d
创建图类 :done