美文网首页
弗洛伊德算法 求任意点最短路径2021-07-30

弗洛伊德算法 求任意点最短路径2021-07-30

作者: lancelot123 | 来源:发表于2021-07-30 11:06 被阅读0次

package dijkstraV2;

import java.util.ArrayList;
import java.util.List;

class FloydInGraph {

private static int INF = Integer.MAX_VALUE;
//dist[i][j]=INF<==>i 和 j之间没有边
private int[][] dist;
//顶点i 到 j的最短路径长度,初值是i到j的边的权重
private int[][] path;
private List<Integer> result = new ArrayList<Integer>();

public static void main(String[] args) {
    FloydInGraph graph = new FloydInGraph(7);
    String[] strArr = {"b1", "b2", "b7", "b8", "b3", "b4", "b5"};
    int[][] matrix = {
            // b1, b2, b7, b8, b3, b4, b5
            /*0 b1*/{INF, 900, INF, INF, INF, INF, INF},
            /*1 b2*/{900, INF, 400, INF, 100, INF, INF},
            /*2 b7*/{INF, 400, INF, 50, INF, INF, INF},
            /*3 b8*/{INF, INF, 50, INF, INF, INF, INF},
            /*4 b3*/{INF, 100, INF, INF, INF, 200, INF},
            /*5 b4*/{INF, INF, INF, INF, 200, INF, 150},
            /*6 b5*/{INF, INF, INF, INF, INF, 150, INF},
    };
    int begin = 3;
    int end = 6;
    graph.findCheapestPath(begin, end, matrix);
    List<Integer> list = graph.result;
    System.out.println(strArr[begin] + " to " + strArr[end] + ",the cheapest path is:");
    //System.out.println(list.toString());
    StringBuffer sb = new StringBuffer();
    for (Integer idx : list) {
        sb.append(strArr[idx] + "->");
    }
    System.out.println(sb);
    System.out.println(graph.dist[begin][end]);
}

public void findCheapestPath(int begin, int end, int[][] matrix) {
    floyd(matrix);
    result.add(begin);
    findPath(begin, end);
    result.add(end);
}

public void findPath(int i, int j) {
    int k = path[i][j];
    if (k == -1) return;
    findPath(i, k);   //递归
    result.add(k);
    findPath(k, j);
}

public void floyd(int[][] matrix) {
    int size = matrix.length;
    //initialize dist and path
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            path[i][j] = -1;
            dist[i][j] = matrix[i][j];
        }
    }
    for (int k = 0; k < size; k++) {
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    path[i][j] = k;
                }
            }
        }
    }
}

public FloydInGraph(int size) {
    this.path = new int[size][size];
    this.dist = new int[size][size];
}

}

相关文章

  • 弗洛伊德算法 求任意点最短路径2021-07-30

    package dijkstraV2; import java.util.ArrayList;import jav...

  • 图-最短路径-弗洛伊德算法

    多源点最短路径-弗洛伊德算法(Floyd) 求所有顶点到所有顶点的最短路径,而迪杰斯特拉是求单源点到所有顶点的最短...

  • 5. Floyd算法

    Floyd算法 : 求图中任意一对顶点间的最短路径; 通常用方阵来表示图中每两点之间的最短路径的过程方阵的阶数越高...

  • 弗洛伊德算法求图的最短路径 JavaScript实现

    弗洛伊德算法求图的最短路径 JavaScript实现 核心思想我们假设Dis(i,j)为节点u到节点v的最短路径的...

  • 《啊哈算法》笔记(一)

    1 桶排序2 冒泡排序3 快速排序4 队列,栈,链表5 弗洛伊德算法 -最短路径:求两个城市之间的最短路径6 迪杰...

  • 弗洛伊德算法(最短路径问题)

    1. 介绍: 弗洛伊德算法和迪杰斯特拉算法一样,都是求最短路径的。迪杰斯特拉算法是求某一个顶点到其他各顶点的最短路...

  • 19-图的最短路径

    图的最短路径 迪杰斯特拉算法 贝尔曼-福特算法 弗洛伊德算法 SPFA算法(中国西南交通大学段凡丁发明) 最短路径...

  • JavaScript数据结构19—最短路径Floyd算法

    弗洛伊德算法适用于为图中每一个顶点求最短路径,思路如下 检查图中任何一个 到 任何另一个点能否通过第一个点降低最短...

  • 最短路径算法

    最短路径算法可以分为两类:单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。多源最短路径问题:求任...

  • Dijkstra 算法

    Dijkstra 算法 前言 为了达到任意两结点的最短路径,我们有几种算法可以实现:Dijkstra 算法、Flo...

网友评论

      本文标题:弗洛伊德算法 求任意点最短路径2021-07-30

      本文链接:https://www.haomeiwen.com/subject/tciqvltx.html