Problema de Dijkstra

package org.dijkstra;

import java.util.Arrays;

/**
 * 迪杰斯特拉-邮差邮寄最短路径问题
 * @author cjj_1
 * @date 2020-09-10 15:41
 */
public class DijkstraDemo {
    
    
    public static void main(String[] args) {
    
    
        char[] chars={
    
    'A','B','C','D','E','F','G'};
        final  int N = 65535;
        int[][] matrix = {
    
    
                {
    
    N,5,7,N,N,N,2},
                {
    
    5,N,N,9,N,N,3},
                {
    
    7,N,N,N,8,N,N},
                {
    
    N,9,N,N,N,4,N},
                {
    
    N,N,8,N,N,5,4},
                {
    
    N,N,N,4,5,N,6},
                {
    
    2,3,N,N,4,6,N}
        };
        Graph graph = new Graph(chars,matrix);
        graph.dijkstra(chars.length,6);
    }
}

/**
 * 节点关系类
 */
class VertexsRelation{
    
    
    int[] pre_visited;//节点是否被访问过 下标标表示节点 1表示访问过 0表示没有被访问过
    int[] pre_previous;//节点的前驱,下标标表示节点,对值表示前驱节点,初始化为-1
    int[] dis;//表示与目标节点的最短距离
    int length ;
    //初始化
    public VertexsRelation(int length,int index){
    
    
        pre_visited = new int[length];
        pre_previous = new int[length];
        dis = new  int[length];
        this.length = length;
        for (int i=0;i<length;i++){
    
    
            pre_previous[i]=-1;
            if(i==index){
    
    
                dis[i]=0;
            }else {
    
    
                dis[i] = 65565;
            }
        }
    }

    /**
     * 更新j节点的前驱是 index
     * @param index
     * @param j
     */
    public void updatePrevious(int index,int j){
    
    
        pre_previous[j]= index;
    }

    /**
     * 更新index 节点被访问过
     * @param index
     */
    public void updateIsvisited(int index){
    
    
        pre_visited[index] =1;
    }

    /**
     * index 被访问过返回true,否则返回false
     * @param index
     * @return
     */
    public boolean isvisited(int index){
    
    
        return  pre_visited[index]==1;
    }



}
class Graph{
    
    
      char[] vertexs;
      int[][] matrix;
      VertexsRelation vr;

    /**
     * 初始化 图的基本数据
     * @param vertexs
     * @param matrix
     */
      public  Graph(char[] vertexs,int[][] matrix){
    
    
          this.vertexs = vertexs;
          this.matrix = matrix;
      }

    /**
     * 迪捷斯卡尔算法
     * @param length
     * @param index
     */
      public  void dijkstra(int length,int index){
    
    
          vr = new VertexsRelation(length,index);
          int index1 = updateDis(index);
          for(int j =1;j<length;j++){
    
    
             index1 = updateDis(index1);
          }
          for(int i=0;i<vr.dis.length;i++){
    
    
              System.out.print(vertexs[i]+"最短距离:"+vr.dis[i]+"; ");

          }
          System.out.println();
          for(int i=0;i<vr.pre_previous.length;i++){
    
    
              System.out.print(vertexs[i]+"前驱节点:"+vr.pre_previous[i]+"; ");

          }

      }

    public int updateDis(int index) {
    
    
        int min = 65565;
        int dis;
        int min_index = -1;
        vr.pre_visited[index] =1;
        for(int i =0;i<vr.dis.length;i++){
    
    
            if(!vr.isvisited(i)) {
    
    
                dis = vr.dis[index] + matrix[index][i];
                if(vr.dis[i]>dis){
    
    
                    vr.dis[i] = dis;
                    vr.pre_previous[i]=index;
                }
                if (min >vr.dis[i]) {
    
    
                    min = vr.dis[i];
                    min_index = i;
                }
            }
          }
        return  min_index;s
    }



    /**
     * 打印图
     */
    public void print(){
    
    
          for (int i =0;i<matrix.length;i++){
    
    
              System.out.print(Arrays.toString(matrix[i]));
          }
          System.out.println();
      }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_40128696/article/details/108573193
Recomendado
Clasificación