Dijkstra 算法 Java实现

本文深入解析了Dijkstra算法,一种用于寻找图中两点间最短路径的经典算法。通过实例演示了算法的具体实现过程,包括初始化距离数组、寻找最短距离节点、更新距离和前驱节点等关键步骤。

本算法是求V0到各个点的最短距离

import java.util.Arrays;

class Vertex{

    int distance;//到这个点的距离
    int preVertexIndex;//为了到达此点的前一个点的下标
    boolean sure = false;//标志这个点是否被确定,默认未确定
    public Vertex(int distance, int preVertexIndex){
        this.distance = distance;
        this.preVertexIndex = preVertexIndex;
    }

    @Override
    public String toString() {
        return "["+distance+","+preVertexIndex+"]";
    }
}

public class Main {

    //矩阵阶数
    static int matrixOrder = 6;

    //无穷距离
    static int MD = 999;

    //距离数组
    static Vertex[] distance = new Vertex[matrixOrder];


    //邻接矩阵
    //第一行表示V0->Vi(i=0,1,2,3,4,5)的距离,其它类似
    static int[][] arcs = {
            {0,       50,     10,     MD,    45,     MD},
            {MD,      0,      15,     MD,     5,     MD},
            {20,      MD,      0,     15,    MD,     MD},
            {MD,      20,     MD,      0,    35,     MD},
            {MD,      MD,     MD,     30,     0,     MD},
            {MD,      MD,     MD,      3,    MD,     0 }} ;

    //从距离数组中查找距离值最短的节点下标
    static int findShortestDistanceVertexIndexFromDistanceArray(){
        int shortestDistance = MD;
        int shortestVertexIndex = matrixOrder;
        for(int i = 0; i < matrixOrder; i++){
            if(distance[i].sure == false && distance[i].distance <= shortestDistance){
                shortestDistance = distance[i].distance;
                shortestVertexIndex = i;
            }
        }
        return shortestVertexIndex;
    }

    //判断是否结束
    static boolean isOver(){
        for(int i = 0; i < matrixOrder; i++){
            if(distance[i].sure == false)
                return false;
        }
        return true;
    }

    static void calculateShortestDistance(){

        //初始化距离数组
        for(int i = 0; i < matrixOrder; i++){
            Vertex vertex;
            if(arcs[0][i] != MD){
                vertex = new Vertex(arcs[0][i], 0);
            }else {
                vertex = new Vertex(arcs[0][i], -1);
            }
            distance[i] = vertex;
        }

        while (true){
            if(isOver())
                break;
            int shortestVertexIndex = findShortestDistanceVertexIndexFromDistanceArray();
            for(int i = 0; i < matrixOrder; i++){
                if(distance[i].sure)
                    continue;
                if(distance[shortestVertexIndex].distance + arcs[shortestVertexIndex][i] < distance[i].distance){
                    distance[i].preVertexIndex = shortestVertexIndex;
                    distance[i].distance = distance[shortestVertexIndex].distance + arcs[shortestVertexIndex][i];
                }
            }
            distance[shortestVertexIndex].sure = true;
        }
    }

    public static void main(String[] args) {
        calculateShortestDistance();
        System.out.println(Arrays.toString(distance));
    }

}
### Dijkstra算法Java实现 Dijkstra算法用于计算加权连通图中从一个给定起点到其他所有节点的最短路径。此算法采用贪心策略逐步构建最短路径树。 下面是一个完整的Dijkstra算法Java实现示例: ```java import java.util.Arrays; public class DijkstraAlgorithm { private static final int NO_PARENT = -1; public void calculateShortestPath(int[][] adjacencyMatrix, int startVertex) { int nVertices = adjacencyMatrix[0].length; int[] shortestDistances = new int[nVertices]; boolean[] added = new boolean[nVertices]; Arrays.fill(shortestDistances, Integer.MAX_VALUE); Arrays.fill(added, false); shortestDistances[startVertex] = 0; int lastAddedVertex = startVertex; for (int i = 1; i < nVertices; ++i) { int nearestVertex = -1; int shortestDistance = Integer.MAX_VALUE; for (int vertexIndex = 0; vertexIndex < nVertices; ++vertexIndex) { if (!added[vertexIndex] && shortestDistances[lastAddedVertex] + adjacencyMatrix[lastAddedVertex][vertexIndex] < shortestDistance) { nearestVertex = vertexIndex; shortestDistance = shortestDistances[lastAddedVertex] + adjacencyMatrix[lastAddedVertex][vertexIndex]; } } shortestDistances[nearestVertex] = shortestDistance; added[nearestVertex] = true; lastAddedVertex = nearestVertex; } printSolution(startVertex, shortestDistances); } private void printSolution(int startVertex, int[] distances) { System.out.println("Source Vertex: " + startVertex); for (int vertexIndex = 0; vertexIndex < distances.length; ++vertexIndex) { System.out.println(String.format("Destination Vertex : %d Distance from Source: %d", vertexIndex, distances[vertexIndex])); } } } ``` 上述代码定义了一个`calculateShortestPath`方法来执行Dijkstra算法,接收邻接矩阵表示法下的图以及起始顶点作为参数[^2]。该函数初始化距离数组并将初始结点的距离设为零;接着迭代更新最近未访问过的邻居直到遍历完所有的顶点并打印最终的结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值