Floy算法
来源:互联网 发布:蜜桃影音软件苹果 编辑:程序博客网 时间:2024/05/17 03:42
Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
算法思想:
1、Floyd算法递归地产生一个矩阵序列adj(0),adj(1),…, adj(k) ,…, adj(n)
2、adj(k)[i,j]等于从顶点Vi到顶点Vj中间顶点序号不大于k的最短路径长度
假设已求得矩阵adj(k-1),那么从顶点Vi到顶点Vj中间顶点的序号不大于k的最短路径有两种情况:
(1)一种是中间不经过顶点Vk,那么就有adj(k)[i,j]=adj(k-1)[i,j]
(2)另一种是中间经过顶点Vk,那么adj(k)[i,j]< adj(k-1)[i,j],且adj(k)[i,j]= adj(k-1)[i,k]+ adj(k-1)[k,j]
图解过程如下:
代码如下:
#include "GraphLink.h"class Dist{public:int index; //顶点的索引值,仅Dijkstra算法会用到int length;//顶点之间的距离int pre;//路径最后经过的顶点bool operator < (const Dist &dist){return length < dist.length;}bool operator <= (const Dist &dist){return length <= dist.length;}bool operator > (const Dist &dist){return length > dist.length;}bool operator >= (const Dist &dist){return length >= dist.length;}bool operator == (const Dist &dist){return length == dist.length;}};//Floyd算法void floyd(Graph& G, Dist** &D){D = new Dist*[G.verticesNum()];// 为数组D申请空间for(int i = 0; i < G.verticesNum(); i++){D[i] = new Dist[G.verticesNum()]; // 初始化数组D}for(int i = 0; i < G.verticesNum();i++){for(int j = 0; j < G.verticesNum(); j++){if(i == j){D[i][j].length = 0;D[i][j].pre = i;}else{D[i][j].length = INFINITE;D[i][j].pre = -1;}}}for(int i = 0; i < G.verticesNum();i++){for(Edge edge = G.firstEdge(i);G.isEdge(edge); edge = G.nextEdge(edge)){D[i][G.toVertex(edge)].length = G.weight(edge);D[i][G.toVertex(edge)].pre = i;}}//算法的核心: 如果两个顶点间的最短路径经过顶点v,则更新最短距离for(int v = 0; v < G.verticesNum();v++){for(int i = 0; i < G.verticesNum();i++){for(int j = 0; j < G.verticesNum(); j++){if (D[i][j].length > (D[i][v].length+D[v][j].length)) {D[i][j].length = D[i][v].length+D[v][j].length;D[i][j].pre = D[v][j].pre;}}}}}//int A[N][N] = {// v0v1v2/*v0*/0,4,11,/*v1*/6,0,2,/*v2*/3, INFINITE, 0 };int main(){GraphLink<ListUnit> graphLink(N); // 建立图 graphLink.initGraph(graphLink, A,N); // 初始化图Dist **dist;floyd(graphLink,dist);for (int i = 0; i < N; i ++) {for (int j = 0; j < N; j ++)cout << dist[i][j].length << " ";cout << endl;}system("pause");return 0;}
运行结果如下:
0 0
- Floy算法
- floy
- poj 3615(Cow Hurdles) floy 算法
- Floy-Warshall算法例题 HDU_1596题解
- 无向图最小环算法floy
- Floy最短路径
- poj2253(dijkstra||dijkstra||floy…
- poj3660 Cow Contest(Floy判关系)
- 2080用的Floy果断超时,留个纪念哦.cpp
- poj 1975 Median Weight Bead(floy…
- HDU 5418 Victor and World(状压dp、floy最短路)
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 解决在IE浏览器中点击登录出现打开或保存json文件的提示
- isp下载写保护
- Makefile函数学习(一)
- Spring Security-授权(AccessDecisionManager,AccessDecisionVoter) .
- Windows核心服务器的搭建过程
- Floy算法
- 介绍自己的家乡
- 黑马程序员_javaIO流_2
- Timus 1009 DP
- openssl学习笔记之pkcs7- signed-data内容类型的编码解码
- Linux中的find、grep命令
- Timus 1010 DP
- 一步一步制作yaffs/yaffs2根文件系统--生成yaffs/yaffs2镜像文件及下载到开发板
- java程序的打包与发布