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)必 ...
随机推荐
- ORGANIZATION
Leader: Ming Xiang Ph.D students: Bo Yang Yupei Zhang M.Eng. students: Cheng Feng Jinquan Du Youli ...
- Linux(Red Hat 6 32位) 下安装Mysql5.6.30
转载地址:http://my.oschina.net/fusxian/blog/300480 1. 下载MySQL 5.6 下载页面:http://dev.mysql.com/downloads/my ...
- RabbitMQ(四) -- Routing
RabbitMQ(四) -- Routing `rabbitmq`可以通过路由选择订阅者来发布消息. Bindings 通过下面的函数绑定Exchange与消息队列: channel.queue_bi ...
- [WinAPI] API 1 [桌面上画一个简单彩色图形]
#include<Windows.h> void GdiOut(HDC hdc); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hP ...
- [游戏模版11] Win32 动画 时间消息
>_<:This time we will study a new way to operate your picture.That is running your picture by ...
- [BTS] Action demo In BizTalk WCF-SAP Adapter
I use following xml config in BizTalk 2010 WCF-SAP adapter. <BtsActionMapping xmlns:xsi="htt ...
- APP API如何维护多个版本的一些想法?
1.第一种形式:api版本号放在url路径中 https://api.example.com/v1/user/ID https://api.example.com/v2/user/ID https:/ ...
- SpringMVC实现一个controller写多个方法
MultiActionController与ParameterMethodNameResolver在一个Controller类中定义多个方法,并根据使用者的请求来执行当中的某个方法,相当于Struts ...
- atitit.微信项目开发效率慢的一些总结
atitit.微信项目开发效率慢的一些总结 #---理念问题..这个是最大的问题.. 要有专人提升开发效率才好.. #---没有一个好的开发方法体系.... ini deve 法. fell asd+ ...
- Template Method模式和Strategy模式[继承与委托]
继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...