最短路径——Floyd算法

简介: 最短路径——Floyd算法

最近再刷2021蓝桥杯真题时刷到一道题,用到了floyd或者dijkstra。这两种都是用来求最短路径问题的。虽然之前学的深度优先算法(DFS)和宽度优先算法(BFS)也能求最短路径,但是时间复杂度太高,并且右很大的局限性。这篇我们先学习Floyd算法


学习Floyd算法请点我


Floyd算是dp的一种应用吧,之前学习的前缀和以及二维前缀和都是dp思想。


佛洛伊德是最简单的最短路径算法,可以计算图中任意两点间的最短路径。时间复杂度为O(N3),适用于出现负边权的情况。算法描述:

(a)初始化:点u、v如果有边相连,则dis[u][v]=w[u][v]如果不相连,则dis[u][v]=0x3f

(b)for(k=1;k<-n;k++)


       for(i=1;i<=n;i++)


               for(j=1;j<=n;j++)


                       if(dis[iljl>dis[i]k]+dis[k]lil)


                               disli]j]=dis[i][k]+dis k]lil;


(c)算法结束:dis[ili得出的就是任意起点i到任意终点i的最短路径。


疑问:为什么枚举中间点的循环k要放在最外层?

可以从一定不经过k点与一定经过k点的三维数组比较中推导出来


接下来我们看一道题练习一下;


题目描述

有向图的单源点最短路问题

输入格式

第1行:2个空格分开的整数n(2<=n<=500)和m(10<=m<=20000),分别表示图的顶点数和边数第2.m+1行:每行3个空格分开的整数i,,w。i表示一条边的起点,i表示终点,w表示权值。第m+2行:2个整数s,t1<=s,t<=n)表示指定的顶点。

输出格式

第1行:最小距离

第2行:最短路径(从起点到终点的序列,用1个空格分开)

#include <iostream>
#include <cstring>
using namespace std;
int n,m;
int s,t;
int div[505][505];
int ans[505][505];
void write(int x){
  if(ans[s][x]==0){
    return;
  }
    write(ans[s][x]);           //ans[s][x],代表s->x最短路线中,x点上一个点的数值,x代表终点 
  cout<<x<<' ';
}
int main(){
  memset(div,0x3f,sizeof(div));    //为什么时0x3f,int的4个字节都赋值为0x3f,10的9次方量 
                                      // 级,可以作为无穷大使用
  cin>>n>>m;
  for(int i=1;i<=m;i++){
    int a,b,c;
    cin>>a>>b>>c;
    div[a][b]=c;                 //div[a][b]=c;代表a点连接到b点的距离为c
    ans[a][b]=a;                 //ans[a][b]=a代表a到b要经过a点,也就是自己的位置
  }
  cin>>s>>t;
  for(int i=1;i<=n;i++){          //自己到自己距离为0
    div[i][i]=0;
  }
  for(int k=1;k<=n;k++){
    for(int i=1;i<=n;i++){
      for(int j=1;j<=n;j++){
        if(div[i][j]>div[j][k]+div[k][i]){
          div[i][j]=div[j][k]+div[k][i];     //求每两个点最短距离存储下来
          ans[i][j]=ans[j][k];     //一开始i->j,后来i->k->j中间加一个k,当前点移动 
                                             //到j        
        }
      } 
    }
  }
  cout<<div[s][t]<<' '<<s<<' ';
  write(t);                              //打印路径顶点
  return 0;  
} 
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
4月前
|
算法
Floyd算法
Floyd算法
55 1
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
4月前
|
算法 定位技术
路径规划算法 - 求解最短路径 - A*(A-Star)算法
路径规划算法 - 求解最短路径 - A*(A-Star)算法
147 1
|
4月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
4月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
67 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
4月前
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
103 0
|
1天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
101 80
|
20天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
5天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。