Dijkstra(迪杰斯特拉)算法

8 篇文章 0 订阅

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

求最短路径步骤  

算法步骤如下:  

1. 初使时令 S={V0},T={其余顶点},T中顶点对应的距离值  

    若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值  

    若不存在<V0,Vi>,d(V0,Vi)为∝ 

2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S

3. 对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的

    距离值比不加W的路径要短,则修改此距离值  

    重复上述步骤2、3,直到S中包含所有顶点,即S=T为止

package com.minPath;

import java.util.Scanner;

public class DjistraPath {
    public static int cityNum;//行数
    public static int line;
    public static int bigNum=10000;//
    
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        cityNum=scanner.nextInt();
        line=scanner.nextInt();
        int[][] matrix=new int[cityNum][cityNum];
        int[] dist=new int[cityNum];//用于记录0到其他节点的距离
        boolean[] flag=new boolean[cityNum];//用于标记节点是否被访问
        for(int i=0;i<cityNum;i++)//初始化
            for(int j=0;j<cityNum;j++){
                if(i==j)
                  matrix[i][j]=0;
                else
                  matrix[i][j]=bigNum;    
            }
        for(int k=0;k<line;k++){
           int row=scanner.nextInt();
           int col=scanner.nextInt();
           int value=scanner.nextInt();
           matrix[row][col]=value;
        }
       for(int k=0;k<cityNum;k++){
           dist[k]=matrix[0][k];
           flag[k]=false;//默认都没有访问    
       }
       for(int k=0;k<cityNum;k++){
           System.out.print("  dist"+k+"--"+dist[k]);
       }
       System.out.println();
       int index=0;
       flag[0]=true;//默认第一个点已经访问
       int min;
       for(int i=0;i<cityNum-1;i++){//经过cityNum趟
           min=bigNum;
           for(int w=0;w<cityNum;w++){//没有访问的最小的标记为访问过的
               if(flag[w]==false){
                   if(dist[w]<min){
                       index=w;
                       min=dist[w];
                   }
               }
           }
           System.out.println("index---"+index);
           flag[index]=true;
           System.out.println("pre dist[3]"+dist[3]+" dist[1]"+dist[1]+" matrix[1][3]"+matrix[1][3]);
          for(int j=0;j<cityNum;j++){
            if(flag[j]==false && (dist[j]>dist[index]+matrix[index][j])){
                    dist[j]=dist[index]+matrix[index][j];
            }
//            System.out.print("  跟新---dist("+j+")--"+dist[j]);
         }
           System.out.println("pre dist[3]"+dist[3]+" dist[1]"+dist[1]+" matrix[1][3]"+matrix[1][3]);
           System.out.println();
       }    
       System.out.println("----------");
       for(int i=0;i<cityNum;i++){
           for(int j=0;j<cityNum;j++){
               System.out.print(matrix[i][j]+" ");
               
           }
           System.out.println();
       }
    
       for(int s=1;s<cityNum;s++){
           System.out.println("0----->"+s+":"+dist[s]);
       }
    
    }
}

  1. /* 
  2. Test Date: 
  3. 5 7 
  4. 0 1 3 
  5. 0 3 8 
  6. 1 2 5 
  7. 1 4 4 
  8. 2 3 4 
  9. 2 4 7 
  10. 3 4 2 
  11. Out put: 
  12. 0->1:3 
  13. 0->2:8 
  14. 0->3:8 
  15. 0->4:7 
  16. */

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值