Floyd算法(各对顶点之间的最短距离)

简介:

Floyd算法(各对顶点之间的最短距离)

         在上篇文章中谈论到了如何求算单源最短路径,因此要想求各对顶点之间的距离,只需循环求算n次即可。还有另外一种方法来求算各对顶点之间的最短距离,就是Floyd算法,由于其算法过程比Dijkstra更容易理解,并且代码更简洁,因此当求算各对顶点之间的最短距离常采用Floyd算法。

一.Floyd算法

  假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t<=s<=k)的所有值,并取其中最小者即可。因此可以设置一个中间顶点k(0<=k<n)分别插入到每队顶点(i,j)之中,并更新dist[i][j]的值。当n个顶点插入到每队顶点之中,求解便结束了。其实Floyd算法实质上是一个动态规划算法。

代码实现:

复制代码
/*每对顶点之间最短路径Floyd 2011.8.27*/ 

#include
<iostream>
#include
<stack>
#define M 100
#define N 100
usingnamespace std;

typedef
struct node
{
int matrix[N][M]; //邻接矩阵
int n; //顶点数
int e; //边数
}MGraph;

void FloydPath(MGraph g,int dist[N][M],int path[N][M])
{
int i,j,k;
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
{
if(g.matrix[i][j]>0)
{
dist[i][j]
=g.matrix[i][j];
path[i][j]
=i;
}
else
{
if(i!=j)
{
dist[i][j]
=INT_MAX;
path[i][j]
=-1;
}
else
{
dist[i][j]
=0;
path[i][j]
=i;
}
}
}
for(k=0;k<g.n;k++) //中间插入点(注意理解k为什么只能在最外层)
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
{
if((dist[i][k]>0&&dist[i][k]<INT_MAX)&&//防止加法溢出
(dist[k][j]>0&&dist[k][j]<INT_MAX)&&
dist[i][k]
+dist[k][j]<dist[i][j])
{
dist[i][j]
=dist[i][k]+dist[k][j];
path[i][j]
=path[k][j]; //path[i][j]记录从i到j的最短路径上j的前一个顶点
}
}
}

void showPath(int path[N][M],int s,int t) //打印出最短路径
{
stack
<int> st;
int v=t;
while(t!=s)
{
st.push(t);
t
=path[s][t];
}
st.push(t);
while(!st.empty())
{
cout
<<st.top()<<"";
st.pop();
}

}

int main(int argc, char*argv[])
{
int e,n;
while(cin>>e>>n&&e!=0)
{
int i,j;
int s,t,w;
MGraph g;
int dist[N][M],path[N][M];
g.n
=n;
g.e
=e;
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
g.matrix[i][j]
=0;
for(i=0;i<e;i++)
{
cin
>>s>>t>>w;
g.matrix[s][t]
=w;
}
FloydPath(g,dist,path);
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
{
if(dist[i][j]>0&&dist[i][j]<INT_MAX)
{
showPath(path,i,j);
cout
<<dist[i][j]<<endl;
}
}
}
return0;
}
复制代码
相关文章
|
8月前
|
算法
最短路之Floyd算法
最短路之Floyd算法
92 1
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
102 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
5月前
|
算法
Floyd算法
Floyd算法
62 1
|
3月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
5月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
7月前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
117 1
|
8月前
|
算法
Frogger(Floyd算法)
Frogger(Floyd算法)
|
1天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
14天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
146 80
|
2天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

热门文章

最新文章