最短路径Dijsktra法

public class DijsktraTest {

    public static void main(String[] args) {
        int[][] data1 = { //测试数据1  
                { 0, 1, 4, -1, -1, -1 },  
                { 1, 0, 2, 7, 5, -1 },  
                { 4, 2, 0, -1, 1, -1 },   
                { -1, 7, -1, 0, 3, 2 },  
                { -1, 5, 1, 3, 0, 6 },   
                { -1, -1, -1, 2, 6, 0 } };  
        int[][] data2 = { //测试数据2  
                { 0, 1, 3, 4 },  
                { 1, 0, 1, -1 },  
                { 3, 1, 0, 5 },  
                { 4, -1, 5, 0 } };  
 
        System.out.println(dijkstra(data1, 0,2));  

    }


    public static int dijkstra(int[][] data, int start, int end){
        
        int num = data[0].length;//一共有几个点
        int[] distance = data[start].clone();//标号点到各点的最短路径
        int[] indexs = new int[num];//存放标号的下标集合
        int indexs_count = 0;//indexs集合的计数变量
        boolean[] isLabel = new boolean[num];//是否标号
        int index = start;//从开始点开始搜索
        
        isLabel[start] = true;//标注开始点
        
        while(indexs_count<num){
            
            //求开始点到每个点的最短距离
            int min = Integer.MAX_VALUE;
            for(int i = 0;i<distance.length;i++){
                if(distance[i]!=-1 && i!=index && !isLabel[i]){
                    if(min>distance[i]){
                        min = distance[i];
                        index = i;
                    }
                }
            }//for end
        //找到最短路径的点的下标,并标注下一次从该点开始搜索
        isLabel[index] = true;
        
            if(index==end){
                break;
            }
            
            indexs[indexs_count] = index;
            indexs_count++;
            
            //更新搜索开始点到各点的最短距离
            for(int i = 0;i<distance.length;i++){
                if(!isLabel[i]&&data[index][i]+min<distance[i]&&data[index][i] != -1 ){
                    distance[i] = data[index][i]+min;
                }else if(distance[i] ==-1 && data[index][i] != -1){
                    distance[i] = data[index][i]+min;
                }                
            }//for end
        
        }//while end
        return distance[end] - distance[start];
    }
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值