单源最短路径(Dijkstra算法)

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值