首页 > 编程语言 >Floyd 算法

Floyd 算法

时间:2023-08-09 21:33:14浏览次数:37  
标签:ch int 路径 算法 Floyd 顶点

Floyd 算法:动态规划中的最短路径问题

一、简介

Floyd 算法是一种用于求解图中所有顶点对之间最短路径的动态规划算法。它是由 Robert W. Floyd 在 1965 年提出的,因此得名 Floyd-Warshall 算法。该算法的核心思想是使用动态规划来避免重复计算已经计算过的子问题的解。

二、原理

假设有 n 个顶点的图 G(用邻接矩阵表示),我们需要求解所有顶点对之间的最短路径。设 f[i][j] 表示从顶点 i 到顶点 j 的最短路径长度。我们的目标是求解 f[i][j],其中 i < j 且 i, j∈V(G)。

Floyd 算法的基本思想是:对于任意两个顶点 i 和 j,如果通过顶点 k 可以使 i 到 j 的路径长度更短,那么更新

\[ f[i][j] = min(f[i][j], f[i][k] + f[k][j]) \]

这里的 k 是中间顶点,可以是任何与 i 和 j 相邻的顶点。

Floyd 算法的时间复杂度为 O(n^3),空间复杂度为 O(n^2)。为了降低时间复杂度,可以使用压缩矩阵来存储邻接矩阵。

三、C++ 代码实现

#include<bits/stdc++.h> // 引入常用的C++库
#define reg register // 定义宏,将变量声明为寄存器类型
using namespace std; // 使用标准命名空间

// 读取输入的整数
inline int read(){
	int x=0,f=1;
	char ch=getchar(); // 获取输入的第一个字符
	while(ch<'0'||ch>'9'){ // 如果字符不是数字
		if(ch=='-') f=-1; // 如果是负号,设置标志位为负数
		ch=getchar(); // 继续获取下一个字符
	}
	while(ch>='0'&&ch<='9'){ // 如果字符是数字
		x=(x<<1)+(x<<3)+(ch^48); // 将字符转换为整数并累加到结果中
		ch=getchar(); // 继续获取下一个字符
	}
	return x*f; // 返回结果,如果有负号则返回负数
}

// 输出整数,如果是负数则在前面加上负号
void write(int x){
	if(x<0){
		putchar('-');
		x=-x; // 将负数转换为正数
	}
	if(x>9) write(x/10); // 如果数字大于9,递归调用write函数处理十位数
	putchar(x%10+'0'); // 将个位数输出
	return ;
}

const int MAXN=102,MAXM=4502; // 定义常量,表示矩阵的最大行数和列数
int n,m,d[MAXN][MAXN]; // 定义二维数组d,用于存储最小生成树的权重

int main(){
	n=read(),m=read(); // 读取输入的两个整数n和m
	memset(d,0x3f,sizeof(d)); // 将二维数组d的所有元素初始化为无穷大
	for(reg int i=1;i<=n;i++) d[i][i]=0; // 将对角线上的元素设置为0,因为从一个点到自身的距离为0
	for(reg int i=1;i<=m;i++){ // 对于每条边(u, v, w)
		int u=read(),v=read(),w=read(); // 读取边的起点、终点和权重
		d[u][v]=min(d[u][v],w); // 更新d[u][v]为当前边的权重和d[u][v]中的较小值
		d[v][u]=min(d[v][u],w); // 更新d[v][u]为当前边的权重和d[v][u]中的较小值
	}
	for(reg int k=1;k<=n;k++){ // 对于每个顶点k,计算其所有邻居节点之间的最小生成树的权重之和
		for(reg int i=1;i<=n;i++){
			for(reg int j=1;j<=n;j++){
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]); // 更新d[i][j]为当前边的权重和d[i][j]中的较小值加上从顶点k到其他节点的最小生成树的权重之和
			}
		}
	}
	for(reg int i=1;i<=n;i++){ // 对于每个顶点i,输出其到其他所有顶点的最短路径的权重之和
		for(reg int j=1;j<=n;j++){
			printf("%d ",d[i][j]); // 按照题目要求的格式输出权重之和
		}
		printf("\n"); // 每行输出完毕后换行
	}
	return 0; // 程序正常结束
}

标签:ch,int,路径,算法,Floyd,顶点
From: https://www.cnblogs.com/Nebulary/p/17618039.html

相关文章

  • 分解因数--递归算法
    【题目描述】给出一个正整数a,要求分解成若干个正整数的乘积,即a=a1×a2×a3×...×an,并且1<a1≤a2≤a3≤...≤an,问这样的分解的种数有多少。注意到a=a也是一种分解。【输入】第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1<a<32768)。【输出】n行,每......
  • MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩|附代码数据
    全文链接:http://tecdat.cn/?p=30832最近我们被客户要求撰写关于K-Means(K-均值)聚类算法的研究报告,包括一些图形和统计输出。本文首先阐明了聚类算法的基本概念,介绍了几种比较典型的聚类算法,然后重点阐述了K-均值算法的基本思想,对K-均值算法的优缺点做了分析,回顾了对K-均值改进......
  • LeetCode从算法到算命—1749.任意子数组和的绝对值的最大值
    1749.任意子数组和的绝对值的最大值题目信息给你一个整数数组nums。一个子数组[numsl,numsl+1,...,numsr-1,numsr]的和的绝对值为abs(numsl+numsl+1+...+numsr-1+numsr)。请你找出nums中和的绝对值最大的任意子数组(可能为空),并返回该最大值。abs(x)......
  • 最短路算法大全(Bellman-Ford &Spfa)
    Bellman-Ford算法1、基于松弛操作的单源最短路算法,针对于有向图、2、e[u]存u点的出边的邻点和边权,d[u]存u点到原点的距离3、初始化,d[s]=0,d[其他点]=INF(源点到本身的距离初始化为0到其他点的距离都初始化为无穷)4、执行多轮操作。每轮操作都对所有边尝试一次松弛操作5、......
  • 非对称加密算法
    非对称加密算法是一种使用公钥和私钥配对的加密算法,也称为公钥加密算法.常见的非对称加密算法包括RSA、DSA等,它们遵循公钥分发、私钥保密规则,也就是说公钥是公开的,可以自由分发给其他人.而私钥是保密的,只有私钥的持有者知道.这样可以确保加密和签名的安全性,因为即使公钥......
  • 堆优化模拟退火(List-Based Simulated Annealing|List-Based SA|LBSA|模拟退火) 算法
    堆优化模拟退火(List-BasedSimulatedAnnealing)算法引入堆优化模拟退火(List-BasedSimulatedAnnealing,简称LBSA)是一种对模拟退火的优化算法。由Shi-huaZhan,[1],[2]JuanLin,[1:1]Ze-junZhang,[1:2]Yi-wenZhong[1:3],[2:1]提出。(以下我们以求最小值为例)解释我们......
  • 文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题
    四、如何修改QUICKSORT,使得它能够以非递增序进行排序?文心一言:快速排序(Quicksort)是一种常用的排序算法,基于分治策略进行设计。默认情况下,快速排序会以递增序进行排序。若想修改快速排序以实现非递增排序,我们需要调整比较和交换的逻辑。以下是修改后的非递增快速排序的Python代码......
  • 游戏中的寻路是什么?寻路A算法
     ......
  • TimeId 基于时间戳的自增ID算法(Java版)
    常用的全局唯一ID算法1、UUID首先是大名鼎鼎的UUID,UUID是通用唯一识别码(UniversallyUniqueIdentifier)的缩写。UUID是一个128比特的数值,是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。虽然UUID碰撞几率不为零,但它足够接近于零,可以忽......
  • 美国空军未来利用AI控制无人僚机执行空战或对地作战任务成为可能——AI算法强化学习控
        来源:https://export.shobserver.com/baijiahao/html/640202.html https://baijiahao.baidu.com/s?id=1773463574030646069&wfr=spider&for=pc   作战无人机从有人远程控制进步到AI控制是一个大的跨域和发展,或许在战争中武器实现AI控制才是未来赛博战争该......