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