可以对每一个顶点使用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;
}
}
}
} }

最新文章

  1. 干货分享:MySQL之化险为夷的【钻石】抢购风暴
  2. jquery 层根据矩形路径移动和闪耀(原创)
  3. Win7系统修改hosts文件不能保存的解决方法
  4. PHP 表单验证
  5. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
  6. 【云计算】docker daemon如何提供Restful的API
  7. angular 自定义指令
  8. 关于JFace中的输入值(InputDialog)对话框类
  9. 致命错误: Python.h:没有那个文件或目录
  10. 使IE6下PNG背景透明的七种方法任你选
  11. Oracle CDC简介及异步在线日志CDC部署示例
  12. 网络编程应用:基于TCP协议【实现文件上传】--练习
  13. JS 设计模式七 -- 外观模式
  14. BBS 502 BadGateway 原因分析
  15. Map、List、Set在Java中的各种遍历方法
  16. 分数规划模板(洛谷P4377 [USACO18OPEN]Talent Show)(分数规划,二分答案,背包)
  17. USB学习笔记连载(二十一):CY7C68013A进行数据传输(一)
  18. js执行上下文
  19. 什么是 PWA?
  20. VS2010错误

热门文章

  1. Python中的正则表达式(re)
  2. sqlite--一秒20万数据
  3. python3 互译无线短信接口
  4. SpringBoot中常用注解@Controller/@RestController/@RequestMapping的区别
  5. node.js获取本机Ip, hostName, mac
  6. mezzanine的page_menu tag(二)
  7. leetcode617
  8. Android应用开发中,第三方集成新浪微博(sinaWeiboSDK)的过程记录
  9. linux check
  10. CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题