第二阶段冲刺-04

import com.example.myapplication.Bean.Bean;

import java.util.ArrayList;

/**
 * @author:created By ZhangHao
 * 时间:2019/5/31 09
 * 邮箱:188660586@qq.com
 */
public class Djstl {

    private String[] mVexs;       // 顶点集合
    private int[][] mMatrixs;    // 邻接矩阵
    private static final int INF = Integer.MAX_VALUE; // 最大值

   public Djstl(){}
   public Djstl(String[] vexs, int[][] matrix){
// 初始化顶点数和边数
       int vlen = vexs.length;
       mVexs = new String[vlen];

       for (int i = 0; i < mVexs.length; i++) {
           mVexs[i] = vexs[i];
       }

       mMatrixs = new int[vlen][vlen];
       for (int i = 0; i < vlen; i++)
           for (int j = 0; j < vlen; j++)
               mMatrixs[i][j] = matrix[i][j];



   }

    /*
     * Dijkstra最短路径。
     * 即,统计图中"顶点vs"到其它各个顶点的最短路径。
     *
     * 参数说明:
     *       vs -- 起始顶点(start vertex)。即计算"顶点vs"到其它顶点的最短路径。
     *     prev -- 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。
     *     dist -- 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。
     */

    public ArrayList<Object> floyd(int[][] path, int[][] dist, String []s, String site1, String site2) {
        int indexofsite1 = 0;
        int indexofsite2=0;
        ArrayList<Object> list = new ArrayList<>();
        String temp="";

        // 初始化
        for (int i = 0; i < mVexs.length; i++) {
            for (int j = 0; j < mVexs.length; j++) {
                dist[i][j] = mMatrixs[i][j];
                path[i][j] = j;
            }
        }
        // 计算最短路径
        for (int k = 0; k < mVexs.length; k++) {
            for (int i = 0; i < mVexs.length; i++) {
                for (int j = 0; j < mVexs.length; j++) {
                    // 如果经过下标为k顶点路径比原两点间路径更短,则更新dist[i][j]和path[i][j]
                    int tmp = (dist[i][k] == INF || dist[k][j] == INF) ? INF : (dist[i][k] + dist[k][j]);
                    if (dist[i][j] > tmp) {
                        // "i到j最短路径"对应的值设,为更小的一个(即经过k)
                        dist[i][j] = tmp;
                        // "i到j最短路径"对应的路径,经过k
                        path[i][j] = path[i][k];

                    }
                }
            }
        }
        for(int i=0;i<s.length;i++) {
            indexofsite1=i;
            if(s[i].equals(site1))  break;

        }
        for(int i=0;i<s.length;i++) {
            indexofsite2=i;
            if(s[i].equals(site2))  break;

        }
        System.out.println(site1+"-->"+site2);
        System.out.println("distance:"+dist[indexofsite1][indexofsite2]);


        System.out.print(s[indexofsite1]+"-->");
        while(!s[path[indexofsite1][indexofsite2]].equals(site2)) {
            Bean bean = new Bean();
            temp=s[path[indexofsite1][indexofsite2]];
            bean.setSiteName(s[path[indexofsite1][indexofsite2]]);
            System.out.print(s[path[indexofsite1][indexofsite2]]+"-->");
            indexofsite1=path[indexofsite1][indexofsite2];
            list.add(bean);
        }
        Bean bean1=new Bean();
        bean1.setSiteName(s[indexofsite2]);
        System.out.print(s[indexofsite2]);
        list.add(bean1);
        list.add(dist[indexofsite1][indexofsite2]);
        return list;
    }

}
原文地址:https://www.cnblogs.com/chenyuchun/p/11066769.html