首页 > 编程语言 >多源最短路Floyd算法

多源最短路Floyd算法

时间:2024-12-16 14:14:23浏览次数:4  
标签:int 短路 路径 算法 Floyd void 多源 节点

多源最短路算法-Floyd

使用Floyd(弗洛伊德)算法,可以以 \(O(n^3)\) 的时间复杂度求出一张多源图的任意两点间的最短路径

一般采用邻接矩阵的方法来存储图:

int g[N][N];
g[i][j]

其中,g[i][j]的意义为第i个节点到第j个节点的权重

我们需要对邻接矩阵进行路径初始化,将自身到自身的权重设置为 \(0\) ,到其他节点的距离初始化为 \(+\infty\)(或极大的一个值)

for (int i = 0; i <= N; i++)
	for (int j = 0; j <= N; j++)
		if (i == j) g[i][j] = 0;
		else g[i][j] = 1e9;

对有向图而言,我们通过三个参数进行边的读入:

cin >> u >> v >> w;
g[u][v] = min(g[u][v], w);//判断重边

如果是无向图,则只需要再次赋值反向边即可

g[u][v] = g[v][u] = min(g[u][v], w);

Floyd算法原理:

对任意两个节点a,b而言,如果存在有更短的路径连通它们两个,则必然存在另外一个节点c,使得:

g[a][b] < g[a][c] + g[c][a]

换言之,如果需要更新我们的最短路径,就需要额外的一个中转节点来加入我们的路径中

同样的,如果对经过三个节点的路径a,b,c,能更新一个更短的路径,就需要加入d节点

不难写出以下代码:其中,我们的 i 为新加入的节点

for (int j = 1; j <= N; j++)
	for (int k = 1; k <= N; k++)
		g[j][k] = min(g[j][k], g[j][i] + g[i][k]);

每次遍历两层所有节点,目的是更新每个节点间的最短路径,并判断能否通过新加入的 i 节点,得到一个更短路径

我们的 i节点可以取到所有的节点来作为路径中转
因为相对于任意两个节点,我们都能够使用其余的节点来构建出一条经过任意多的中转节点的最短路径

于是有最终的递推函数,求得最短路:

void floyd(void) {
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
			for (int k = 1; k <= N; k++)
				g[j][k] = min(g[j][k], g[j][i] + g[i][k]);
}

注意:Floyd算法不能对存在负环的图使用,如果存在负环,每次取路径的min时,都会取到更小的负数,导致无法正确退出循环

以洛谷B3647为例:

输出最终的邻接矩阵

#include <iostream>
#include <algorithm>
using namespace std;

int n, m;
int g[105][105];

void floyd(void) {
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int k = 1; k <= n; k++)
				g[j][k] = min(g[j][k], g[j][i] + g[i][k]);
}

int main()
{
	cin >> n >> m;
	int u, v, w;
	for (int i = 0; i <= n; i++)
		for (int j = 0; j <= n; j++)
			if (i != j) g[i][j] = 1e9;
	for (int i = 0; i < m; i++) {
		cin >> u >> v >> w;
		g[u][v] = g[v][u] = min(g[u][v], w);
	}
	floyd();
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++)
			cout << g[i][j] << ' ';
		cout << endl;
	}
	return 0;
}

标签:int,短路,路径,算法,Floyd,void,多源,节点
From: https://www.cnblogs.com/dianman/p/18609942

相关文章

  • 综合设计 ——多源异构数据采集与融合应用综合实践
    综合设计——多源异构数据采集与融合应用综合实践#综合设计——多源异构数据采集与融合应用综合实践码云地址这个项目属于哪个课程<班级的链接>组名、项目简介组名:黑马楼:直面爬虫项目需求:实现宠物具体种类的识别项目目标:根据用户上传的文本和图片识别具体的宠物......
  • 综合设计——多源异构数据采集与融合应用综合实践
    这个项目属于哪个课程https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/组名、项目简介组名:都给爷爬项目目标:为心理疾病患者进行个性化的音乐疗愈项目需求:市面上大多数音乐软件都需要会员而且存在打榜等现象,不能完全个性化推荐,我们希望我们的......
  • 多源异构数据采集与融合应用综合实践
    这个项目属于哪个课程2024数据采集与融合技术实践组名、项目简介组名:scrapy能帮我爬到美味蟹黄堡的秘方吗项目需求:文物不能很好的融入我们的生活,它们仿佛一具冰冷的尸体躺在博物馆的展示柜中,静静地接受着岁月的侵蚀和尘埃的覆盖。项目目标:赋予文物新的生命力,让它们“动......
  • 福卫兵——多源异构数据采集与融合应用综合实践
    福州大学多模态网络舆情分析与可视化系统序号信息类别内容描述1这个项目属于哪个课程数据采集与融合综合实践2组名、项目简介组名:福小兵,项目需求:实时舆情监控系统,项目目标:为福州大学提供舆情监控与决策辅助工具,技术路线:使用Flask后端、Memfire(PostgreSQL)数......
  • 综合设计——多源异构数据采集与融合应用综合实践
    Gitee项目链接:https://gitee.com/wei-yuxuan6/myproject/tree/master/实践作业这个项目属于哪个课程https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology组名在大大的数据里面挖呀挖呀挖项目简介项目名称:城市记忆Logo:项目需求:整合城市......
  • 综合设计——多源异构数据采集与融合应用综合实践
    这个项目属于哪个课程2024数据采集与融合技术实践组名在大大的数据里面挖呀挖呀挖项目简介项目名称:城市记忆Logo:项目需求:整合城市历史文化资源:需要以交互式的方式展示城市的历史发展、新旧照片、方言特色以及名人故事等内容。增强用户参与感:为用户提供交互性......
  • 综合设计——多源异构数据采集与融合应用综合实践
    序号信息类别内容描述1这个项目属于哪个课程数据采集与融合综合实践2组名、项目简介组名:福小兵项目需求:实时舆情监控系统项目目标:为福州大学提供舆情监控与决策辅助工具技术路线:使用Flask后端、Memfire(PostgreSQL)数据库和Vue前端技术栈,建立从数据采集到情......
  • 综合设计 ——多源异构数据采集与融合应用综合实践
    综合设计——多源异构数据采集与融合应用综合实践码云地址这个项目属于哪个课程<班级的链接>组名、项目简介组名:黑马楼:直面爬虫项目需求:实现宠物具体种类的识别项目目标:根据用户上传的文本和图片识别具体的宠物种类项目开展技术路线:html,css,js,flask团队成员......
  • 综合设计——多源异构数据采集与融合应用综合实践
    综合设计——多源异构数据采集与融合应用综合实践这个项目属于哪个课程2024数据采集与融合技术实践组名、项目简介组名:味谱魔方、项目需求:设计出一个交互友好的多源异构数据的采集与融合的小应用、项目目标:本系统旨在实现用户将食品加入购物车,生成对应的食谱核心功......
  • 博物识植—多源异构数据采集与融合应用综合实践
    这个项目属于哪个课程2024数据采集与融合技术实践组名从你的全世界爬过团队logo:项目简介项目名称:博物识植项目logo:项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,提升我......