记录一个只有五行的最短路径求解算法——FloydWarshall

核心思想

结合动态规划思想,通过不断迭代中转点k后两点i、j之间的最短路径来求解。

代码及注释

package others;
/**
 * 只有五行的最短路径求解算法 ——FloydWarshall
 * @author XZP
 * 0表示自身
 * INF表示图中两点不可达
 * 大于零的数字表示两点直接的直接距离
 *
 */
public class FloydWarshall {
//  public static int INF = Integer.MAX_VALUE; // 表示图中两顶点不可达
    public static int INF = 99999; // 注意后面两个INF相加可能溢出的情况,这些都是需要注意的细节
    public static int[][] graph = {
            {0, 2, 6, 4 },
            {INF, 0, 3, INF},
            {7, INF, 0, 1},
            {5, INF, 12, 0}
    };
    public static int size = graph.length;
    public static void main(String[] args) {
        floyd(graph);
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(graph[i][j] + " ");
            }
            System.out.println();
        }
    }
    /**
     * 该算法的核心代码,只有五行!
     * 时间复杂度:O(N^3)
     * @param matrix
     */
    public static void floyd(int[][] matrix) {
        for (int k = 0; k < size; k++) {
            for (int i = 0; i < size; i++) {
                for (int j =0; j <size; j++) {
                    // 动态规划的思想,k表示经过k点中转,如果经过k中转距离更好则替换之
                    if (matrix[i][j] > matrix[i][k] + matrix[k][j]) {
                        matrix[i][j] = matrix[i][k] + matrix[k][j];
                    }
                }
            }
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容