Dijkstra算法

迪杰斯特拉算法用来解决加权有向图的最小路径问题,要求题目是无负权重边。它的算法主体和BFS相似。

算法签名如下:

int[] Dijkstra(int start, List<int[]>[] graph); 

输入是起点和图的邻接表,这里邻接表包含了权重信息。输出是起点到其他点的距离,是一个数组。

为了方便记录从起点到任一点的最小距离,将节点编号和从起点到它的最小距离封装成一个State类。

class State {
    int id;  //节点编号
    int distFromStart;  //从起点到该点的最小路径

    public State(int id, int distFromStart) {
        this.id = id;
        this.distFromStart = distFromStart;
    }
}

最终代码

class State {
    int id;  //节点编号
    int distFromStart;  //从起点到该点的最小路径

    public State(int id, int distFromStart) {
        this.id = id;
        this.distFromStart = distFromStart;
    }
}

class Dijkstra {
    public int[] Dijkstra(int start, List<int[]>[] graph) {
        int n = graph.length;
        int[] distTo = new int[n];  //函数返回值
        for(int i = 0; i < distTo.length; i++) {
            distTo[i] = Integer.MAX_VALUE;
        }

        PriorityQueue<State> pq = new PriorityQueue<>((a, b) -> (a.distFromStart - b.distFromStart));
        pq.offer(new State(start, 0));
        distTo[start] = 0;
        while(!pq.isEmpty()) {
            State curNode = pq.poll();
            int curNodeID = curNode.id;
            int curNodeDist = curNode.distFromStart;

            if(curNodeDist > distTo[curNodeID]) {
                continue;
            }

            for(int[] neighbor : graph[curNodeID]) {
                int nextNodeID = neighbor[0];
                int nextNodeDist = distTo[curNodeID] + neighbor[1];
                if(nextNodeDist < distTo[nextNodeID]) {
                    distTo[nextNodeID] = nextNodeDist;
                    pq.offer(new State(nextNodeID, nextNodeDist));
                }
            }
        }
        return distTo;
    }
}
posted @ 2022-06-24 10:29  dotJunz  阅读(33)  评论(0编辑  收藏  举报