一、使用条件
目的是求图中一个节点(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<int[]>[] grahp){
int[] disTo=new int[grahp.length];
Arrays.fill(disTo,Integer.MAX_VALUE);
disTo[start]=0;
PriorityQueue<State> 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]<StartdiscurNode) continue;
for(int[] linju:grahp[curNodeID]){
int nextNodeID=linju[0];
int disnextNode=linju[1]+disTo[curNodeID];
if(disTo[nextNodeID]<=disnextNode){
continue;
}else{
disTo[nextNodeID]=disnextNode;
pq.offer(new State(nextNodeID,disnextNode));
}
}
}
return disTo;
}
二、应用范围
leetcode743,1631,1514,787
一般有向加权图的输入是三元组[(u,v,w)],代表u到v这条边的权重为w,记录一下三元组转为图的模板。
List<int[]>[] grahp=new LinkedList[n+1];
for(int i=1;i<n+1;i++){
grahp[i]=new LinkedList<>();
}
for(int[] edges:times){
int from=edges[0];
int to=edges[1];
int w=edges[2];
grahp[from].add(new int[]{to,w});
}
times为输入的三元组数组