Dijkstra 是单源最短路算法
思路
https://blog.csdn.net/lbperfect123/article/details/84281300
Dijkstra 思路是维护一个集合 s ,集合内的点是已经确定最短路的点,可以视为一个大整体,每次操作找出与集合相邻的点中距离起点最近的点加入集合中,并确定它的最短路为它的上家的最短路+该边权值,存在 dis 中
代码
import java.util.*;
class Solution {
public static void main(String[] args){
int N = 8;
//有向图
int[] A = new int[]{1,1,2,2,3,4,4,4,5};
int[] B = new int[]{2,3,4,3,5,3,5,6,6};
int[] W = new int[]{1,12,3,9,5,4,13,15,4};
int[] H = new int[]{2,4};
int[][] map = new int[N+1][N+1];
for(int[] ma:map){
Arrays.fill(ma,Integer.MAX_VALUE);
}
for(int i=1;i<=N;i++)
{
map[i][i]=0;
}
for(int i = 0;i < A.length;i++) {
//边权重都为1
map[A[i]][B[i]] = W[i];
}
Solution s = new Solution();
int[] vis = new int[N+1];
int[] dis = new int[N+1];
Arrays.fill(dis,Integer.MAX_VALUE);
Arrays.fill(vis,0);
s.Dijkstra(N,1,dis,vis,map);
for(int i:dis){
System.out.println(i);
}
}
/*
N 是节点数量
u是最短路径的起始点
dis[N + 1] 是确定的最短路径点集合
vis[N+1] 是最短路径集合的点是否已经访问过
map[N+1][N+1] 是路径图
*/
public void Dijkstra(int N,int u,int[] dis,int[] vis,int[][] map) {
vis[u]=1;
for(int t=1;t<=N;t++)
{
dis[t]=map[u][t];
}
for(int t = 1; t < N; ++t) {
int minn= Integer.MAX_VALUE;
int temp = 0;
for(int i=1;i<=N;i++) {
//从没确定最短的的一个节点选择最下的
if(vis[i] == 0&&dis[i]<minn)
{
minn=dis[i];
temp=i;
}
}
vis[temp]=1;
for(int i=1;i<=N;i++)
{
//map[temp][i]+dis[temp] 溢出了
if(((long)map[temp][i]+(long)dis[temp])<(long)dis[i])
{
dis[i]=map[temp][i]+dis[temp];
}
}
}
}
}