froyd求最短路径基础算法
2012-07-14 16:25
260 查看
求最短路径当中形式最好看的算法。也很容易理解。
核心思想:通过加入k顶点,然后求出各顶点到其余顶点中间结点编号不大于k的最小值。
DP思想体现:froyd是一个经典的DP求解最短路径的算法,采用自底向上方式计算路径。这里这个ki(i=1——n)不妨看成是一个阶段,每一个ki加入就是在每一个阶段做出决策:从i到j的最短路径上是否包含结点k。
上一个状态:Dk-1【i】【j】
当前状态:Dk【i】【j】
状态转移方程:Dk【i】【j】=min{Dk-1【i】【j】,Dk-1【i】【k】+Dk-1【k】【j】},1=<K<=n
D0【i】【j】={ (1)w(i,j) 当<i,j>属于E,
(2)inf(无穷大) 反之 }
#include<iostream>
using namespace std;
#define inf 0x6ffffff
int map[300][300];
int n;
void floyd()
{
for(int k=1;k<=n;k++) //核心思想的体现,第1重循环加入k,是为了在加入k之后更新之后的所有路径
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(map[i][k]!=inf && map[k][j]!=inf && map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
int main()
{
int tt,m,s,t;
cin>>tt ;
while(tt--)
{
scanf("%d%d%d%d",&n,&m,&s,&t);
int a,b,w;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)// //memset(mm,inf,sizeof(mm));不能用memset,我勒个去
map[i][j]=inf;
for(int i=1;i<=m;i++)//
{
scanf("%d%d%d",&a,&b,&w);
map[a][b]=w;
map[b][a]=w;//
}
floyd();
printf("s->t's min road: % d\n",map[s][t]);
}
system("pause");
return 0;}
核心思想:通过加入k顶点,然后求出各顶点到其余顶点中间结点编号不大于k的最小值。
DP思想体现:froyd是一个经典的DP求解最短路径的算法,采用自底向上方式计算路径。这里这个ki(i=1——n)不妨看成是一个阶段,每一个ki加入就是在每一个阶段做出决策:从i到j的最短路径上是否包含结点k。
上一个状态:Dk-1【i】【j】
当前状态:Dk【i】【j】
状态转移方程:Dk【i】【j】=min{Dk-1【i】【j】,Dk-1【i】【k】+Dk-1【k】【j】},1=<K<=n
D0【i】【j】={ (1)w(i,j) 当<i,j>属于E,
(2)inf(无穷大) 反之 }
#include<iostream>
using namespace std;
#define inf 0x6ffffff
int map[300][300];
int n;
void floyd()
{
for(int k=1;k<=n;k++) //核心思想的体现,第1重循环加入k,是为了在加入k之后更新之后的所有路径
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(map[i][k]!=inf && map[k][j]!=inf && map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
int main()
{
int tt,m,s,t;
cin>>tt ;
while(tt--)
{
scanf("%d%d%d%d",&n,&m,&s,&t);
int a,b,w;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)// //memset(mm,inf,sizeof(mm));不能用memset,我勒个去
map[i][j]=inf;
for(int i=1;i<=m;i++)//
{
scanf("%d%d%d",&a,&b,&w);
map[a][b]=w;
map[b][a]=w;//
}
floyd();
printf("s->t's min road: % d\n",map[s][t]);
}
system("pause");
return 0;}
相关文章推荐
- Dijkstra求单源最短路径(图论基础算法)
- 算法基础 - 单源点最短路径SPFA
- 基础算法之Dijkstra最短路径
- JAVA代码—算法基础:三角形最短路径问题
- 算法基础 - 多源点最短路径(Floyd算法)
- 每对顶点的最短路径 : Johnson 算法
- 图--单源最短路径 -Bellman Ford 算法(可以存在负权边的情况和负权回路)算法导论p362
- 基于postGIS的室内地图最短路径算法二
- 计算最短路径的A* 算法简介
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 第七章 图(最短路径算法:dijkstra,bellman-ford,floyd)
- 最短路径算法
- 算法笔记——【贪心算法】单源最短路径问题
- 算法证明1 最短路径性质
- Floyed 算法求最短路径
- 算法——数据结构图的最短路径实现JAVA代码
- 最短路径问题的相关算法
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
- 经典算法之图的最短路径(一):Dijkstra算法