通过看了下别人代码用递归方式修改了下,资源消耗多了点,但看起来容易理解点
public class ShortPath_Dijkstra_my {
private static String[] minPath;
private static int[] minDist;
private static int[][] dataWeight;
//点到点的距离用二维数组表示,不可到达的路线用最大值表示
private int[][] ds_weight(){
int[][] graph = new int[6][6];
graph[0][2] = 10;
graph[0][4] = 30;
graph[0][5] = 100;
graph[1][2] = 5;
graph[2][3] = 50;
graph[3][5] = 10;
graph[4][5] = 60;
graph[4][3] = 20;
for (int i=0,i1=graph.length;i!=i1;i++){
for (int j=0,j1=graph[i].length;j!=j1;j++){
if(graph[i][j]!=0){
graph[j][i] = graph[i][j];
}else{
graph[i][j]=Integer.MAX_VALUE;
}
}
}
return graph;
}
public void test1(int[][] p,int start){
//初始化
init(p,start);
//判断点是否处理
boolean[] verified = new boolean[p.length];
verified[start] = true;
recursion(verified,0,start);
}
private void init(int[][] ps,int start){
minPath = new String[ps.length];
minDist = new int[ps.length];
dataWeight = ps;
for (int i=0,i1=ps.length;i!=i1;i++){
minDist[i] = ps[start][i];
minPath[i] = start+ "->"+i;
}
}
public void recursion(boolean[] verified,int lastW,int start){
for(int i=0,i1=dataWeight.length;i!=i1;i++){
if(!verified[i]&&dataWeight[start][i]!=Integer.MAX_VALUE){
if(lastW+dataWeight[start][i]<minDist[i]){
minDist[i] = lastW+dataWeight[start][i];
minPath[i] =minPath[start]+"->"+i;
}
boolean[] verified_1 = new boolean[verified.length];
System.arraycopy(verified,0,verified_1,0,verified.length);
verified_1[i] = true;
recursion(verified_1,minDist[i],i);
}
}
}
public static void main(String[] args) {
ShortPath_Dijkstra_my demo = new ShortPath_Dijkstra_my();
int[][] ds = demo.ds_weight();
int start = 0;
demo.test1(ds,start);
for(int i = 0 ; i < ds.length ; i ++){
if(i==start){
continue;
}
System.out.println("起始点"+start+"到" + i + "的最短路径为:" + minPath[i] + "距离为:" + minDist[i]);
}
}
}
结果输出为: