美文网首页
动态规划(三,Floyd算法)

动态规划(三,Floyd算法)

作者: 腊鸡程序员 | 来源:发表于2019-03-20 17:34 被阅读0次
66658.jpg
概述:

Floyd算法是为了找出带权图中的多源最短路径,即从图中一个顶点到宁一个顶点权重最小的路径.

思想:

分别用二维数组p,d表示图的边和权重



如果从顶点v1到顶点v2的权重是4,从顶点v1>v0>v2的总权重是3.
那么,路径数组p中p[1][2]改为p[1][0],权重数组d中d[1][2]改为d[1][0]+d[0][2].


image.png
上面是以v0为跳板,优化了路径和权重.
那么,我们分别以每个顶点为跳板,依次做优化操作,就可以得到图的多源最短路径
image.png

最后,我们输出顶点之间的多源最短路径.
比如,从顶点v1>v3.
从最终的二维数组d和p,我们可以推到出:
倒数第一步:v1>v2
倒数第二步:v1>v0
即,路径为v1>v0>v2>v3.

代码:
import org.junit.Test;

public class Floyd {
    public static final int I = 100;
    //邻接距阵
    public static int[][] d = new int[][]{
            {0, 2, 1, 5},
            {2, 0, 4, I},
            {1, 4, 0, 3},
            {5, I, 3, 0}
    };
    public static int[][] p=new int[][]{
            {0,1,2,3},
            {0,1,2,3},
            {0,1,2,3},
            {0,1,2,3}
    };

    private void floyd(){
        for (int k = 0; k < d.length; k++) {
            for (int i = 0; i < d.length; i++) {
                for (int j = 0; j < d.length; j++) {
                    if (d[i][j]>d[k][j]+d[i][k]){
                        d[i][j] = d[k][j]+d[i][k];
                        p[i][j] = p[i][k];
                    }
                }
            }
        }
    }

    private void printShortPath(){
        for (int i = 0; i < d.length; i++) {
            for (int j = 0; j < d.length; j++) {
                int k = p[i][j];
                System.out.println("v"+i+">"+"v"+j+" weight:"+d[i][j]+" path: v"+i+" >v"+k);
                while (k!=j){
                    k = p[k][j];
                    System.out.println("v"+k);
                }
            }
        }
    }

    @Test
    public void test(){
        floyd();
        printShortPath();
    }

}

相关文章

  • 最短路径解决方法

    Floyd算法;Dijkstra算法;Bellman-Ford算法;动态规划算法

  • 深度透析Floyd算法

    Floyd算法 1、概念 Floyd算法(罗伯特·弗洛伊德命名) Floyd算法又称为插点法,是一种利用动态规划的...

  • 动态规划(三,Floyd算法)

    概述: Floyd算法是为了找出带权图中的多源最短路径,即从图中一个顶点到宁一个顶点权重最小的路径. 思想: 分别...

  • Floyd 算法

    Floyd 算法 简介 Floyd 算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径...

  • 最短路径 之 Floyd 算法

    • 最短路径 之 Dijkstra 算法• 最短路径 之 Bellman 算法 Floyd算法是基于一种动态规划的...

  • floyd算法解析

    floyd算法可求得多源点间的最短路径算法使用动态规划求解: 状态转移方程 dp[i][j][k]=min(dp[...

  • python面试笔记

    知识点: 红黑树和AVL树 floyd算法(延申:动态规划+贪心算法) 修饰器 生成器 朴素匹配法和kmp匹配法 ...

  • (11)图算法3: 所有节点对最短路径与最大流问题

    所有结点对的最短路径问题 Floyd算法 前提条件: 可以有负权重边, 但是不能有负权重的环. 特点: 动态规划,...

  • 最短路径 - Floyd算法

    算法思想 Floyd算法是一种动态规划算法,查找i到j之间的最短距离,我们可以找一个中间点k,然后变成子问题,i到...

  • 算法(6)-动态规划(LCS算法,KMP算法,Floyd算法)

    前言 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision pr...

网友评论

      本文标题:动态规划(三,Floyd算法)

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