当前位置: 首页 > news >正文

Floyd算法(最短路问题)

文章目录

  • Floyd算法介绍
  • Floyd算法思路
    • 代码及讲解

Floyd算法介绍

Floyd算法是一种用于找出加权图中所有顶点间最短路径的动态规划方法。它通过逐步考虑每个顶点作为中转点,检查是否有更短路径。算法首先初始化一个权值矩阵,然后通过三层循环更新矩阵,直到找到最终的最短路径。文章提供了算法实例和代码实现,并指出Floyd算法能处理负权边但不能处理负环图,适用于小规模问题。

Floyd算法思路

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德。

核心思路: 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。

算法过程:

1.从任意一条单边路径开始。左右两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。

2.对于每一对顶点u和v,看是否存在一个顶点w使得从u到w再到v比已知的路径更短,如果更短,则更新它。

代码及讲解

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define PII pair<int,int> 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int d[1100][1100],p[1100][1100],m,n;
signed main()
{IOSmemset(d,0x3f,sizeof d);cin>>m>>n;for(int i=1;i<=n;i++){int a,b,c;cin>>a>>b>>c;d[a][b]=c;d[b][a]=c;}for(int i=1;i<=m;i++)d[i][i]=0; for(int k=1;k<=m;k++){for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){if(d[i][j]>d[i][k]+d[k][j]){d[i][j]=d[i][k]+d[k][j];p[i][j]=k;}}}}for(int i=1;i<=m;i++){for(int j=1;j<=m;j++)cout<<d[i][j]<<" ";cout<<endl;}return 0;
}

http://www.mrgr.cn/news/2623.html

相关文章:

  • 【论文学习与撰写】快捷搜索指令filetype:pdf,搜索引擎关键词搜索pdf格式文件或者word格式文件。文献搜索方法大全。
  • 集团数字化转型方案(四)
  • 性能基础之硬盘性能知识必知必会
  • Javaweb学习之JavaScript输出与字符串(二)
  • 【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面(一)
  • Android.bp和Android.mk文件有的区别
  • web服务器相关知识
  • Redis
  • web服务nginx
  • 企业选择刀片式服务器租用的用途?
  • Ubuntu/Windows双系统中设置 Windows 为默认启动系统的三种方法
  • Hadoop 的基本 shell 命令
  • 如何查看Squid的DNS缓存
  • XSS游戏
  • Servlet的三种写法
  • 生产环境docker nginx+php8.0镜像
  • ubuntu安装虚拟环境(tensorflow、torch)
  • Linux环境开发工具【yum与vim】
  • ESLint 配置的最佳实践
  • 代理模式Proxy