Floyd-Warshall算法
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。
设
为从
到
的只以
集合中的节点为中间节点的最短路径的长度。
- 若最短路径经过点k,则
; - 若最短路径不经过点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算法的更多相关文章
- Floyd—Warshall算法
我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ...
- 图论之最短路径(1)——Floyd Warshall & Dijkstra算法
开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...
- Gym 101873D - Pants On Fire - [warshall算法求传递闭包]
题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...
- Floyd最短路径算法
看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i( ...
- WarShall算法
1.引言 图的连通性问题是图论研究的重要问题之一,在实际中有着广泛的应用.例如在通信网络的联通问题中,运输路线的规划问题等等都涉及图的连通性.因此传递闭包的计算需要一个高效率的算法,一个著名的算法就是 ...
- [C++]动态规划系列之Warshall算法
/** * * @author Zen Johnny * @date 2018年3月31日 下午8:13:09 * */ package freeTest; /* [动态规划系列:Warshall算法 ...
- POJ 2253 Frogger(warshall算法)
题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...
- Warshall算法求传递闭包及具体实现
传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y ...
- Floyd最短路径算法(来自微信公众号“算法爱好者”改编)
暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表 ...
- Algorithm --> Dijkstra和Floyd最短路径算法
Dijkstra算法 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必 ...
随机推荐
- [openwrt 项目开发笔记]: 传送门
“Openwrt 项目开发笔记”系列传送门: [Openwrt 项目开发笔记]:Openwrt平台搭建(一) (2014-07-11 00:11) [Openwrt 项目开发笔记]:Openwrt平台 ...
- C++ Primer学习笔记一
/* 题目要求把字符串BRGBBGRRGBBGBBBGRRGBGRG按RGB顺序排列,空间复杂度为O(1) */#include<iostream> using namespace std ...
- win系统下nodejs安装及环境配置
第一步:下载安装文件下载nodejs,官网:http://nodejs.org/download/,我这里下载的是node-v0.10.28-x86.msi,如下图: 第二步:安装nodejs下载完成 ...
- Zabbix学习笔记一:基本安装与配置
1.下载安装 http://120.52.73.43/tenet.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.0.1/za ...
- C语言实现二叉树-04版
二叉树,通常应当是研究其他一些复杂的数据结构的基础.因此,通常我们应该精通它,而不是了解:当然,可能并不是每个人都认同这种观点,甚至有些人认为理解数据结构就行了!根本没有必要去研究如何实现,因为大多数 ...
- iOS开发-xCode代码格式化xAlign
xCode默认是可以进行代码格式化的,能满足基础开发需求,如果想要个性一些代码对齐方式宏对齐,等号对齐,属性对齐,xAlign就提供了以上三种功能,参考文中效果~ 基础效果 等号对齐: 属性对齐: 宏 ...
- Leetcode 172 Factorial Trailing Zeroes
给定一个数n 求出n!的末尾0的个数. n!的末尾0产生的原因其实是n! = x * 10^m 如果能将n!是2和5相乘,那么只要统计n!约数5的个数. class Solution { public ...
- 15系统函数&数据类型转换(必学)-大话数据库视频教程
大纲:系统函数的用法,case...when的用法,cast关键字的用法,convert的用法 优酷超清地址: 腾讯超清地址: 百度网盘下载地址:http://pan.baidu.com/s/1dDe ...
- Objective-c中 isEqual ,isEqualToString , == 三者的区别
首先 OC中的对象都是用指针表示,方法的调用是基于消息机制实现,== 比较的自然是指针指向的地址 然后 说下 isEqual 和 isEqualToString 的区别 IsEqual 是 NSObj ...
- cocos2d-x 2.x版本接入bugly的总结
最开始项目使用的是自己DIY的很简陋的上报系统,后来改成google breakpad来上报,发现其实都做的不太理想,游戏引擎因为版本历史问题存在一些崩溃问题.后来3.x接入了bugly,我这边抽了几 ...