欢迎访问宙启技术站
智能推送

如何使用Java函数实现最短路径算法的Dijkstra算法

发布时间:2023-07-06 00:53:35

Dijkstra算法是一种经典的用于解决图中单源最短路径问题的算法。它采用贪心策略,通过不断选择当前最短路径的节点来逐步确定最短路径。下面我们将介绍如何使用Java函数实现Dijkstra算法。

首先,我们需要定义一个Graph类来表示图。这个类可以包含一个节点的集合以及节点之间的边。我们可以使用邻接矩阵或邻接表来存储边的信息,这里我们选择使用邻接表。

class Graph {
    private int numVertices;
    private LinkedList<Edge> adjLists[];

    // 构造函数
    Graph(int numVertices) {
        this.numVertices = numVertices;
        adjLists = new LinkedList[numVertices];
        for (int i = 0; i < numVertices; i++) {
            adjLists[i] = new LinkedList<>();
        }
    }

    // 添加边
    void addEdge(int src, int dest, int weight) {
        Edge edge = new Edge(src, dest, weight);
        adjLists[src].add(edge);
    }
}

接下来,我们定义一个Edge类来表示图中的边。

class Edge {
    int src, dest, weight;

    // 构造函数
    Edge(int src, int dest, int weight) {
        this.src = src;
        this.dest = dest;
        this.weight = weight;
    }
}

然后,我们需要定义一个函数来实现Dijkstra算法。这个函数接受一个Graph对象和一个起始节点作为输入,并返回一个最短路径的数组。

class Dijkstra {
    static final int INF = 99999;

    // Dijkstra算法
    static void dijkstra(Graph graph, int src) {
        int numVertices = graph.numVertices;
        int dist[] = new int[numVertices];
        boolean visited[] = new boolean[numVertices];

        for (int i = 0; i < numVertices; i++) {
            dist[i] = INF;
            visited[i] = false;
        }

        dist[src] = 0;

        for (int count = 0; count < numVertices - 1; count++) {
            int u = minDistance(dist, visited);
            visited[u] = true;

            for (Edge edge : graph.adjLists[u]) {
                int v = edge.dest;
                int weight = edge.weight;

                if (!visited[v] && dist[u] + weight < dist[v]) {
                    dist[v] = dist[u] + weight;
                }
            }
        }

        printSolution(dist);
    }

    // 找到距离最小的节点
    static int minDistance(int dist[], boolean visited[]) {
        int min = INF;
        int minIndex = -1;

        for (int v = 0; v < dist.length; v++) {
            if (!visited[v] && dist[v] < min) {
                min = dist[v];
                minIndex = v;
            }
        }

        return minIndex;
    }

    // 打印最短路径
    static void printSolution(int dist[]) {
        System.out.println("节点  距离");

        for (int i = 0; i < dist.length; i++) {
            System.out.println(i + "       " + dist[i]);
        }
    }
}

最后,我们可以在主函数中创建一个Graph对象,添加边,并调用dijkstra函数来计算最短路径。

public class Main {
    public static void main(String[] args) {
        Graph graph = new Graph(5);
        
        graph.addEdge(0, 1, 10);
        graph.addEdge(0, 4, 5);
        graph.addEdge(1, 2, 1);
        graph.addEdge(1, 4, 2);
        graph.addEdge(2, 3, 4);
        graph.addEdge(3, 2, 8);
        graph.addEdge(3, 0, 7);
        graph.addEdge(4, 1, 3);
        graph.addEdge(4, 2, 9);
        graph.addEdge(4, 3, 2);

        Dijkstra.dijkstra(graph, 0);
    }
}

以上就是使用Java函数实现Dijkstra算法的步骤。通过定义Graph类表示图,Edge类表示边,以及使用Dijkstra类来实现Dijkstra算法,我们可以方便地找到图中单源最短路径并打印出来。