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