赞
踩
public class DP { // 距离矩阵 double[][] distance; // 起点 int start; // 终点 int end; // 记录起点到终点途中每个点的最短距离 double[] dp; /** * @param distance * @param start * @param end * @Description 构造函数 * @Author WSKH */ public DP(double[][] distance, int start, int end) { this.distance = distance; this.start = start; this.end = end; } /** * @Description 进行求解 * @Author WSKH */ public void solve() { dp = new double[distance.length]; Arrays.fill(dp,Double.MAX_VALUE); getMinLen(end); System.out.println(Arrays.toString(dp)); System.out.println("最短路程长度为:"+dp[end]); } /** * @param end 终点索引 * @Description 获取起点到终点的最长路径 * @Author WSKH */ public double getMinLen(int end) { if(end==start){ dp[start] = 0; return 0; } double min = Double.MAX_VALUE; for (int i = 0; i < distance.length; i++) { // 如果i点可以去到end点 if (i != end && distance[i][end] != Double.MAX_VALUE) { if (dp[i] != Double.MAX_VALUE) { min = Math.min(min, dp[i] + distance[i][end]); } else { min = Math.min(min, getMinLen(i) + distance[i][end]); } } } dp[end] = min; return min; } }
public class Test { public static void main(String[] args) { double[][] distance = new double[][]{ {0,5,6,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE}, {Double.MAX_VALUE,0,Double.MAX_VALUE,Double.MAX_VALUE,3,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE}, {Double.MAX_VALUE,Double.MAX_VALUE,0,3,6,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE}, {Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,0,3,Double.MAX_VALUE,1,4,Double.MAX_VALUE,Double.MAX_VALUE}, {Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,0,4,2,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE}, {Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,0,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,4}, {Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,0,Double.MAX_VALUE,5,Double.MAX_VALUE}, {Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,0,2,Double.MAX_VALUE}, {Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,0,2}, {Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,0} }; new DP(distance,0,9).solve(); } }
控制台输出:
[0.0, 5.0, 6.0, 9.0, 8.0, 12.0, 10.0, 13.0, 15.0, 16.0]
最短路程长度为:16.0
注意:此算法只适用于无环图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。