图论Dijkstra算法模板和应用

一、使用条件

目的是求图中一个节点(k)到某一个节点的最短距离,或者最大距离,使用Dijkstra算法要求图是加权有向图且没有负权重的边。

输入:加权有向图

输出:一个数组disTo ,代表k到i节点的最短距离。

模板如下

class State{
        int id;
        int disFromStart;
        State(int id,int disFromStart){
            this.id=id;
            this.disFromStart=disFromStart;
        }
    }
    int[] dijkstra(int start,List[] grahp){
        int[] disTo=new int[grahp.length];
        Arrays.fill(disTo,Integer.MAX_VALUE);
        disTo[start]=0;
        PriorityQueue pq=new PriorityQueue<>(
            (a,b)->{return a.disFromStart-b.disFromStart;}
        );
        pq.offer(new State(start,0));
        while(!pq.isEmpty()){
            State curNode=pq.poll();
            int curNodeID=curNode.id;
            int StartdiscurNode=curNode.disFromStart;
            if(disTo[curNodeID]

二、应用范围

leetcode743,1631,1514,787

一般有向加权图的输入是三元组[(u,v,w)],代表u到v这条边的权重为w,记录一下三元组转为图的模板。

List[] grahp=new LinkedList[n+1];
        for(int i=1;i();
        }
        for(int[] edges:times){
            int from=edges[0];
            int to=edges[1];
            int w=edges[2];
            grahp[from].add(new int[]{to,w});
        }

times为输入的三元组数组

你可能感兴趣的:(算法,图论,leetcode)