百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

经典算法——弗洛伊德算法(弗洛伊德算法基本思想)

yuyutoo 2025-04-07 20:56 1 浏览 0 评论

弗洛伊德算法(Floyd-Warshall Algorithm)

一、概念与用途

弗洛伊德算法是一种解决所有对任意顶点间的最短路径问题的动态规划方法。在有向加权图中,它能够计算出从任意一个顶点到其他所有顶点的最短路径及其长度。

二、算法原理

1. 初始化:

创建一个n×n的矩阵 dist,其中 dist[i][j] 表示从顶点i到顶点j的初始距离,对于不存在的边,其值可以设置为无穷大。

2. 动态规划迭代:

对于每一对顶点 (k, i) 和 (k, j),如果通过顶点k作为中间点能使路径 i -> k -> j 的总距离小于当前已知的最短路径 i -> j 的距离,则更新 dist[i][j] 为新的更短距离。

3. 迭代结束条件:

当所有可能的中间节点都考虑过后,dist 矩阵中的元素即表示从每个顶点到其他所有顶点的最短路径长度。

三、C++ 示例代码片段

#include 
#include 
using namespace std;

const int MAX = 5; // 假设图有5个顶点
int dist[MAX][MAX]; // 存储最短路径信息的矩阵

void floydWarshall(int n) {
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			dist[i][j] = (i == j) ? 0 : numeric_limits::max(); // 初始化为无穷大或0
			// 加载起始时的邻接矩阵数据,这里假设已经存在一个函数 loadAdjMatrix(dist)
			// 弗洛伊德算法核心迭代过程
	for (int k = 0; k < n; ++k) {
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < n; ++j) {
				if (dist[i][k] + dist[k][j] < dist[i][j]) {
					dist[i][j] = dist[i][k] + dist[k][j];
				}
			}
		}
	}
}
// 主函数部分,加载邻接矩阵数据并调用floydWarshall函数
int main() {
	// 假设 loadAdjMatrix 函数已经将邻接矩阵数据填充进 dist 矩阵
	loadAdjMatrix(dist);
	floydWarshall(MAX);
	// 输出结果或者进一步处理最短路径信息
	return 0;
}

上述代码展示了弗洛伊德算法的基本实现框架。在实际应用中,你需要根据具体问题的输入方式来实现 loadAdjMatrix 函数以加载邻接矩阵数据。

最终得到的 dist 矩阵中,dist[i][j] 就是顶点i到顶点j的最短路径长度。若需要存储最短路径本身,还需要额外的空间记录前驱节点信息以便重构路径。

相关推荐

国内外注塑机及电脑密码大全(常见注塑机通用密码)

一、国外注塑机(日本、德国等)东洋注塑机万能码:9422345日精注塑机密码:222|7777DAMEG注塑机密码:000000000新泻注塑机密码:241650|261450住友注塑机密码:...

并发编程实战来咯(并发编程的艺术和并发编程实战)

提到并发编程,就不得不提C++ConcurrencyinAction(SecondEdition)(《C++并发编程实战第2版》)啦!《C++并发编程实战第2版》英文原版&中文译版看到这个...

无锁队列Disruptor原理解析(无锁队列应用场景)

队列比较队列...

理解 Memory barrier(内存屏障)(内存屏障 volatile)

...

并发编程 --- CAS原子操作(cas概念、原子类实现原理)

...

无锁CAS(附无锁队列的实现)(cas是一种无锁算法)

本文所有代码对应的Github链接为:https://github.com/dongyusheng/csdn-code/tree/master/cas_queue...

Linux高性能服务器设计(linux 服务器性能)

C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...

浅谈Go语言的并发控制(go语言 并发)

前言本文原创,著作权归...

Datenlord |Etcd 客户端缓存实践(etcd 数据存储)

简介和背景...

无锁编程——从CPU缓存一致性讲到内存模型

缓存是一个非常常用的工程优化手段,其核心在于提升数据访问的效率。缓存思想基于局部性原理,这个原理包括时间局部性和空间局部性两部分:...

打通 JAVA 与内核系列之 一 ReentrantLock 锁的实现原理

...

如何利用CAS技术实现无锁队列(cas会锁总线吗)

linux服务器开发相关视频解析:...

Kotlin协程之一文看懂Channel管道

概述Channel类似于Java的BlockingQueue阻塞队列,不同之处在于Channel提供了挂起的send()和receive()方法。另外,通道Channel可以...

详解C++高性能无锁队列的原理与实现

1.无锁队列原理1.1.队列操作模型...

Javascript 多线程编程的前世今生

...

取消回复欢迎 发表评论: