单源最短路径(Dijkstra算法)

来源:互联网 发布:asp.net 微信商城源码 编辑:程序博客网 时间:2024/05/16 15:41

单源最短路径问题,给定带权有向图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;    }}