单源最短路径问题,给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。
可以到达的点填权值 否则为无限大
1.先找出v0到各顶点中的当前未找到最短路径的顶点vi的最短的权值(也就是最短的路径),此时v到vi的最短路径就是该权值 将该点设置为已找到最短路径 如:当前为v0到v1最小 所以v1到v0的最短路径为10 ;之后 再次寻找时就是v3最小了。
2.找到v0的当前最小路径的顶点vi,在寻找从vi到各个顶点的路径只和,是否小于从v0到该顶点的路径,若小于 则更新v0到该点的距离,否则继续寻找。
3.回到第一步 重复 直到计算到所有点都找到最短路径(最多循环n-1次)
运行结果:从0出发到0的最短距离为:0
从0出发到1的最短距离为:10
从0出发到2的最短距离为:50
从0出发到3的最短距离为:30
从0出发到4的最短距离为:60
public class Dijkstra_单源最短路径 {
static int M=10000;//(此路不通)
public static void main(String[] args) {
int[][] weight2 = {
{M,10,M,30,100},
{M,M,50,M,M},
{M,M,M,M,10},
{M,M,20,M,60},
{M,M,M,M,M}
};
int start=0;
int[] shortPath = Dijsktra(weight2,start);
for(int i = 0;i < shortPath.length;i++)
System.out.println("从"+start+"出发到"+i+"的最短距离为:"+shortPath[i]);
}
public static int[] Dijsktra(int[][] weight,int start){
int n=weight.length;
int sp[]=new int[n];//记录最短路径长度
boolean can[]=new boolean[n];//判断是否找到最短路径
can[start]=true;
for(int a=1;a<n;a++){
int k=0;
int min=Integer.MAX_VALUE;
for(int i=0;i<n;i++){ //找到当前最短路径
if(!can[i]&&weight[start][i]<min){
min=weight[start][i];
k=i;
}
}
sp[k]=min;
can[k]=true;
for(int i=0;i<n;i++){ //以该顶点为中间点,更新数据
if(!can[i]&&min+weight[k][i]<weight[start][i]){
weight[start][i]=weight[k][i]+min;
}
}
}
return sp;
}
}