关闭

Floyd算法详解

标签: 算法动态规划
1828人阅读 评论(0) 收藏 举报
分类:

简介 :

  • Floyd算法是解决任意两点间的最短路径的一种算法
  • Floyd算法是一个经典的动态规划算法
  • Floyd算法的时间复杂度为O(N3),空间复杂度为O(N2)

算法描述与原理:

首先我们的目标是寻找从点i到点j的最短路径。从一个节点 i 到 节点 j,无非就是两种情况

  • 直接从 i 点 到 j 点
  • 如 i 点出发经过若干个点到达 j 点

要找出最 i 节点 到 j 节点的最短距离,我们可以用dis(i,j)来表示 i 到 j的距离,对于 i 节点 到 j 节点 的每一个点 k ,我们可以得出

 dis(i,k)+dis(k,j)<dis(i,j)

当这个式子成立时我们可以证明,i直接到j的距离不是最短距离,这时我们可以写出这样一个式子

 dis(i,j)=dis(i,k)+dis(k,j)

这样的话 我们就只需要遍历所有节点 一次都进行上面的操作,这样dis(i,j) 就是 i 节点到 j 节点的最短距离

具体操作

  • 对每两点的距离都赋予一个权值(在这里可以理解为距离)
  • 对于每对点 x 和 y,判断是否有 一个顶点 x 到 z 再到 y的距离比直接x 到 y的距离要短

具体代码 :

import java.util.*;
import java.io.*;

public class Main{
    private static final int MAX = 1<<29;
    private static int[][] map;
    private static Scanner scanner;
    private static int num = 0,mum  = 0;
    static {
        map = new int[100][100];
        scanner = new Scanner(new BufferedInputStream(System.in));
    }
    public static void main(String[] args) {
        while(scanner.hasNext()) {
            num = scanner.nextInt();
            mum = scanner.nextInt();
            /*初始化数组*/
            for (int i = 1; i<=num; i++) {
                for (int j = 1; j<=num; j++) {
                    if (i!=j) {
                        map[i][j] = MAX;                                    
                    }else {
                        map[i][j] = 0; //对于每个点自己到自己的权值(距离)为 0 
                    }                   
                }           
            }
            /*手动添加每两个点之间的距离*/
            for (int i = 1; i<=mum; i++) {
                int x,y,z;
                x = scanner.nextInt();
                y = scanner.nextInt();
                z = scanner.nextInt();
                map[x][y] = z;          
            }
            /* 核心算法,对于num个k 从 i 点 k点 再到 j点 与直接 i 到 j的距离相比较 取最小值*/
            for (int k = 1;k <= num ; k++) {
                    for (int i = 1;i <= num ; i++) {
                        for (int j = 1; j <= num; j++) {
                            if (i!=j&&j!=k) {
                                map[i][j] = Math.min(map[i][j],map[i][k]+map[k][j]);
                            }
                         }
                    }
                }   
                /* 打印 每两个点之间的最短路径*/
                for (int i = 1; i <= num; i++ ) {
                    for (int j = 1; j <= num; j++ ) {
                        System.out.printf("dis %d %d = %d\n",i,j,map[i][j]);
                    }
                }

        }
    }

}
1
0
查看评论

结点对最短路径之Floyd算法原理详解及实现

上两篇博客介绍了计算单源最短路径的Bellman-Ford算法和Dijkstra算法。Bellman-Ford算法适用于任何有向图,即使图中包含负环路,它还能报告此问题。Dijkstra算法运行速度比Bellman-Ford算法要快,但是其要求图中不能包含负权重的边。 单源最短路径之Bellman...
  • Ivan_zgj
  • Ivan_zgj
  • 2016-06-02 14:08
  • 7573

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one’s life. Name:Willam Time:2017/3/81、最短路径问题介绍问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径解决问题的算法: 迪杰斯...
  • qq_35644234
  • qq_35644234
  • 2017-03-11 17:01
  • 25101

Floyd算法的原理和实现

一.算法介绍 Floyd算法是一种在有向图中求最短路径的算法。相比不能再有向图中包含负权值的dijkstra算法,Floyd算法可以用在拥有负权值的有向图中求解最短路径(不过不能包含负权回路)。它是一种求解有向图中点与点之间最短路径的算法。 我们检查有向图中的每一个节点X,对于图中过的2点A和B...
  • u014309268
  • u014309268
  • 2014-12-14 04:26
  • 2224

Floyd算法(原理|代码实现)

正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所...
  • u011644423
  • u011644423
  • 2014-07-18 22:02
  • 785

Floyd算法的java实现

Floyd算法:用于多源最短路径的求解,算出来的是所有的节点到其余各节点之间的最短距离。 该算法的思路是:首先初始化距离矩阵,然后从第一个点开始逐渐更新矩阵点值。d[i][j]表示从i点到j点的距离。第k次更新时,判断d[i][k]+d[k][j]与d[i][j]的大小,如果前者小,则更新...
  • sinat_22013331
  • sinat_22013331
  • 2016-03-28 19:19
  • 678

Floyd算法详讲

正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,...
  • niushuai666
  • niushuai666
  • 2011-09-13 21:54
  • 13079

Floyd算法的原理与应用

  • 2009-12-27 20:20
  • 2KB
  • 下载

Floyd 算法原理

[转] Floyd 算法原理     floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在),floyd算法加入了...
  • twobqn123
  • twobqn123
  • 2013-07-19 16:03
  • 629

Floyd算法求图最短路径及实现

最短路径搜索是基于Floyd算法的改进。Floyd算法的基本思想 图1 选i到j的最短路径 Floyd算法的基本思想是:比较直接从i到j和从i经k到j的路径长度,选择较短的一条。当此条最短路径选定后,无论是i->j,或者是i->k->j都可以抽象成i->j,既都是以i为...
  • LoHiauFung
  • LoHiauFung
  • 2016-12-06 15:51
  • 1479

floyd算法详解

一、floyd算法求任意两点之间的最短路(实质上是动态规划):       算法原理:i、j 两点间的最短路径只有两种情况:直接从 i 到 j 或者通过中转点。                ...
  • yuyanggo
  • yuyanggo
  • 2015-08-27 17:32
  • 617
    个人资料
    • 访问:112191次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论