Floyd多源最短路
2024-08-24 19:07:47
可以对每一个顶点使用Dijkstra算法求多源最短路。
这里我们来介绍另一种解法:Floyd
Floyd算法的主要思想是迭代。每次迭代会朝着答案更近一步。
首先定义一个二维数组Dk[i][j](k初始等于0).这个二维数组代表从i到j的最短距离。
Floyd更适合解决稠密图,所以我们使用邻接矩阵来表示图。
初始化:
如果i,j有路 D0[i][j] = G[i][j] (G为我们的邻接矩阵)
否则 D0[i][j] = INF(正无穷大)
(1)我们加入一个顶点,这个点的加入可能会影响到某两个点之间的最短路。所以检查任意i到k, k到j之间的距离。
如果 Dk-1[i][k] + Dk-1[k][j] < Dk[i][j]
更新 :Dk[i][j] = Dk-1[i][k] + Dk-1[k][j]
(2)循环加入每一个顶点,直到所以顶点都被加入,Floyd结束。
(如果我们想得到两个点之间的路径, 在执行算法的同时记录path[i][j])
#define MaxVertexNum 100000 typedef int Vertex;
typedef struct Node
{
Vertex id;
}Node; typedef struct MyGraph
{
int g[MaxVertexNum][MaxVertexNum];
int v, e;
}MyGraph; void Floyd(MyGraph& G, int D[][], Vertex path[][])
{
//初始化
for(Vertex i = ; i < G.v; i++)
{
for(Vertex j = ; j < G.v; j++)
{
if(G.g[i][j] == -)
D[i][j] = INF;
else
D[i][j] = G.g[i][j];
}
} //迭代
for(Vertex k = ; k < G.v; k++)
{
for(Vertex i = ; i < G.v; i++)
{
for(Vertex j = ; j < G.v; j++)
{
//如果得到更小的路径,更新
if(D[i][j] > D[i][k] + D[k][j])
{
D[i][j] = D[i][k] + D[k][j];
path[i][j] = k;
}
}
}
} }
最新文章
- 干货分享:MySQL之化险为夷的【钻石】抢购风暴
- jquery 层根据矩形路径移动和闪耀(原创)
- Win7系统修改hosts文件不能保存的解决方法
- PHP 表单验证
- poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
- 【云计算】docker daemon如何提供Restful的API
- angular 自定义指令
- 关于JFace中的输入值(InputDialog)对话框类
- 致命错误: Python.h:没有那个文件或目录
- 使IE6下PNG背景透明的七种方法任你选
- Oracle CDC简介及异步在线日志CDC部署示例
- 网络编程应用:基于TCP协议【实现文件上传】--练习
- JS 设计模式七 -- 外观模式
- BBS 502 BadGateway 原因分析
- Map、List、Set在Java中的各种遍历方法
- 分数规划模板(洛谷P4377 [USACO18OPEN]Talent Show)(分数规划,二分答案,背包)
- USB学习笔记连载(二十一):CY7C68013A进行数据传输(一)
- js执行上下文
- 什么是 PWA?
- VS2010错误
热门文章
- Python中的正则表达式(re)
- sqlite--一秒20万数据
- python3 互译无线短信接口
- SpringBoot中常用注解@Controller/@RestController/@RequestMapping的区别
- node.js获取本机Ip, hostName, mac
- mezzanine的page_menu tag(二)
- leetcode617
- Android应用开发中,第三方集成新浪微博(sinaWeiboSDK)的过程记录
- linux check
- CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题