Floyd也是采用动态规划的方案来解决在一个有向图G=(V,E)上每对顶点间的最短路径问题。运行时间为Θ(V3)。

算法分析:

  用邻接矩阵map[][]存储有向图,用dist[i][j]表示i到j的最短路径。设G的顶点为V={1,2,3...n},对于任意一对顶点i,j属于V,假设i到j有路径且中间节点皆属于集合{1,2,3...k},P是其中的一条最小权值路径。就是i到j的最短路径P所通过的中间顶点最大不超过k。

  设为从的只以集合中的节点为中间节点的最短路径的长度。

  1. 若最短路径经过点k,则
  2. 若最短路径不经过点k,则

  因此,

for k ←  to n do
for i ← to n do
for j ← to n do
if (Di,k + Dk,j < Di,j) then
Di,j←Di,k + Dk,j ;

实现代码:

/*************************************************************************
> File Name: Floyd_Warshall.cpp
> Author: He Xingjie
> Mail: gxmshxj@163.com
> Created Time: 2014年06月12日 星期四 15时57分22秒
> Description:
************************************************************************/
#include<iostream>
#include<cstdio>
using namespace std; #define MAX 20
#define INF 65535 //map邻接矩阵,dist记录最短路径,path用于最短路径
int map[MAX][MAX], dist[MAX][MAX], path[MAX][MAX]; int Init()
{
int n; cin>>n;
for (int i=; i<n; i++)
for(int j=; j<n; j++)
{
cin>>map[i][j];
dist[i][j] = map[i][j];
path[i][j] = ;
} return n;
} void Floyd(int n)
{
int i, j, k; for (k=; k<n; k++)
for (i=; i<n; i++)
for (j=; j<n; j++)
if (dist[i][k] != INF && dist[k][j] !=INF
&& dist[i][j] > dist[i][k] + dist[k][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = k; //i到j要经过K节点
}
} void PrintShortestPath(int i, int j)
{
//递归打印最短路径 if (path[i][j] == ) //表示i->j没有中间节点
{
printf("%d ", j+);
return;
}
else
{
PrintShortestPath(i, path[i][j]);
PrintShortestPath(path[i][j], j);
}
} void PrintMap(int n)
{
int i, j; for (i=; i<n; i++)
{
for (j=; j<n; j++)
cout<<dist[i][j]<<" ";
cout<<endl;
}
cout<<endl;
} int main()
{
int n; freopen("input.txt", "r", stdin);
n = Init();
Floyd(n);
PrintMap(n); for (int i=; i<n; i++)
{
for (int j=; j<n; j++)
{
if (i != j)
{
cout<<i+<<" ";
PrintShortestPath(i, j);
cout<<endl;
}
}
cout<<endl;
}
return ;
} // :

 输入数据:

    -

  -
    

输出数据:

参考:

http://zh.wikipedia.org/zh/%E5%BC%97%E6%B4%9B%E4%BC%8A%E5%BE%B7%E7%AE%97%E6%B3%95

http://www.cppblog.com/mythit/archive/2009/04/21/80579.aspx

Floyd-Warshall算法的更多相关文章

  1. Floyd—Warshall算法

    我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ...

  2. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  3. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  4. Floyd最短路径算法

    看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i( ...

  5. WarShall算法

    1.引言 图的连通性问题是图论研究的重要问题之一,在实际中有着广泛的应用.例如在通信网络的联通问题中,运输路线的规划问题等等都涉及图的连通性.因此传递闭包的计算需要一个高效率的算法,一个著名的算法就是 ...

  6. [C++]动态规划系列之Warshall算法

    /** * * @author Zen Johnny * @date 2018年3月31日 下午8:13:09 * */ package freeTest; /* [动态规划系列:Warshall算法 ...

  7. POJ 2253 Frogger(warshall算法)

    题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...

  8. Warshall算法求传递闭包及具体实现

    传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y ...

  9. Floyd最短路径算法(来自微信公众号“算法爱好者”改编)

    暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表 ...

  10. Algorithm --> Dijkstra和Floyd最短路径算法

    Dijkstra算法 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必 ...

随机推荐

  1. [Orchard] 通过指定RouteData设置Pager的链接地址

    Orchard 中的Pager是一个很方便的用来分页的Shape, 但默认情况下,它是使用当前Action的地址作为链接地址,如果分页的数据要是由别的Action提供时,这样的分页链接就不对了,其实它 ...

  2. .NET Socket服务编程之-高效连接接入编

    在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务积累了一些经验.在接下来的时间里会把这方面的经验通过博客的方式分享出来.而这一章主要是讲解在如果提高服务连接接入的效 ...

  3. Eclipse的常用快捷键、旁门左道、系统错误小贴士

    转自:http://usenrong.iteye.com/blog/1113700 eclipse是一个开源产品,目前比较流行和普遍的JAVA IDE(集成开发环境)它使用工程化方式管理.虽然ecli ...

  4. .net 获取当前周及根据年和周获取起始结束时间

    获取当前日期周数 int str = new System.Globalization.GregorianCalendar().GetWeekOfYear(System.DateTime.Now, S ...

  5. Mac OS X 安装ruby环境

    1.查看版本 $ ruby -v ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14] 2.查看源 $ gem ...

  6. Nginx学习笔记(七) 创建子进程

    Nginx创建子进程 ngx_start_worker_processes位于Nginx_process_cycle.c中,主要的工作是创建子进程. 在Nginx中,master进程和worker进程 ...

  7. 支持事件穿透?使用pointer-events样式

    使用绝对定位元素,让元素A完全盖住元素B时,如何通过元素A来响应元素B的事件呢? 上图可以用下面的SVG代码来实现: <svg width="200" height=&quo ...

  8. windows下python检查文件是否被其它文件打开.md

    有时候我们需要能够判断一个文件是否正在被其它文件访问,几乎不可避免的要调用操作系统接口 from ctypes import cdll import os _sopen = cdll.msvcrt._ ...

  9. [2]. jekyll安装与应用

    一.ruby安装 这里在win下安装ruby,对应自己电脑的操作系统位数,如我的是64位,对应下载Ruby 2.0.0-p353 (x64)这个版本的ruby.然后安装过程就很简单了: 命令行下输入r ...

  10. DataGridView列排序混乱的处理方法

    在C#程序开发中DataGridView可以说是使用最多的数据呈现控件了,但是在使用的过程中我们会发现当绑定的数据源有较多数据列的时候,DataGridView上显示的列的顺序就会出现混乱的现象. 那 ...