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; } }