Floyd思想可用下式描述:
A-1[i][j]=gm[i][j]
A(k+1)[i][j]=min{Ak[i][j],Ak[i][k+1]+Ak[K+1][j]}    -1<=k<=n-2
该式是一个迭代公式,Ak表示已考虑顶点0,1,.......,k等k+1个顶点之后各顶点之间的最短路径,即Ak[i][j]表示由Vi到Vj已考虑顶点0,1,.......,k等k+1个顶点的最短路径;在此基础上再考虑顶点k+1并求出各顶点在考虑了顶点k+1之后的最短路径,即得到Ak+1.每迭代一次,在从vi到vj的最短路径上就多考虑了一个顶点;经过n次迭代后所得到的A(n-1)[i][j]值,就是考虑所有顶点后从Vi到Vj的最短路径,也就是最终的解。
若Ak[i][j]已经求出,且顶点i到顶点j的路径长度为Ak[i][j],顶点i到顶点k+1的路径长度为Ak[i][k+1],顶点k+1到顶点j的路径长度为Ak[K+1][j],现在考虑顶点k+1,如果Ak[i][K+1]+Ak[k+1][j]<Ak[i][j],则将原来顶点i到顶点j的路径改为:顶点i到顶点k+1,再由顶点k+1到顶点j;对应的路径长度为:A(k+1)[i][j]=Ak[i][k+1]+Ak[k+1][j];否则无需修改顶点i到顶点j的路径.
参考代码:
 #include<stdio.h>
#define MAXSIZE 6//带权有向图中顶点的个数
#define INF 32767 void Ppath(int path[][MAXSIZE],int i,int j)//前向递归查找路径上的顶点,MAXSIZE为常数
{
int k;
k=path[i][j];
if(k!=-)
{
Ppath(path,i,k);//找顶点vi的前一个顶点vk
printf("%d->",k);//输出顶点vk序号k
Ppath(path,k,j);//找顶点vk的前一个顶点vj
}
} void Dispath(int A[][MAXSIZE],int path[][MAXSIZE],int n)//输出最短路径的函数
{
int i,j;
for(i=;i<n;i++)
for(j=;j<n;j++)
if(A[i][j]==INF)//INF为一极大常数
{
if(i!=j)
printf("从%d到%d没有路径!\n",i,j);
}
else//从vi到vj有最短路径
{
printf("从%d到%d的路径长度:%d,路径:",i,j,A[i][j]);
printf("%d->",i);//输出路径上的起点序号i
Ppath(path,i,j);//输出路径上的各中间点序号
printf("%d\n",j);//输出路径的终点序号j
}
} void Floyd(int gm[][MAXSIZE],int n)//Floyd算法
{
int A[MAXSIZE][MAXSIZE],path[MAXSIZE][MAXSIZE];
int i,j,k;
for(i=;i<n;i++)
for(j=;j<n;j++)
{A[i][j]=gm[i][j];//A-1[i][j]置初值
path[i][j]=-;//-1表示初始时最短路径不经过中间顶点
}
for(k=;k<n;k++)//按顶点编号k递增的次序查找当前顶点之间的最短路径长度
for(i=;i<n;i++)
for(j=;j<n;j++)
if(A[i][j]>A[i][k]+A[k][j])
{A[i][j]=A[i][k]+A[k][j];//从vi到vj经过vk时路径长度更短
path[i][j]=k;//记录中间顶点Vk的编号
}
Dispath(gm,path,n);//输出最短路径
} void main()
{
int g[MAXSIZE][MAXSIZE]={{INF,,,INF,INF,INF},{,INF,INF,INF,,},{INF,,INF,INF,INF,},
{INF,INF,INF,INF,INF,INF},{INF,INF,INF,,INF,INF},{INF,INF,INF,,,INF}};
Floyd(g,MAXSIZE);
}

输出结果:

每一对顶点间最短路径的Floyd算法的更多相关文章

  1. 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径

    #include <iostream> #include <string> #include <iomanip> using namespace std; #def ...

  2. 最短路径 - 弗洛伊德(Floyd)算法

    为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点 ...

  3. 图的最短路径---弗洛伊德(Floyd)算法浅析

    算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...

  4. 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...

  5. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

  6. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

  7. 最短路径问题-Floyd算法

    概念 最短路径也是图的一个应用,即寻找图中某两个顶点的最短路径长度. 实际应用:例如确定某两个城市间的坐火车最短行车路线长度等. Floyd algorithm 中文名就是弗洛伊德算法. 算法思路:用 ...

  8. 26最短路径之Floyd算法

    Floyd算法 思想:将n个顶点的图G“分成”很多子图 每对顶点vi和vj对应子图Gij(i=0,1,…,n-1和j=0,1,…,n-1) 每对顶点vi和vj都保留一条顶点限于子图Gij中的最短路径P ...

  9. 最短路径问题——floyd算法

    floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...

随机推荐

  1. ssm项目,web容器无法初始化项目

    在web.xml中配置加载spring时,发现项目无法运行:而去掉spring的配置时,项目可以被初始化. 此时应考虑到spring的配置文件中存在错误,以至于web容器无法对项目成功初始化,在web ...

  2. Base class does not contain a constructor that takes '0' argument

    刚刚在写一段直播室网站中的一段程序遇,突然遇到一个错误,如下 'TVLLKBLL.BaseClass' does not contain a constructor that takes 0 argu ...

  3. JS鼠标滚轮事件解析

    一.不同浏览器的鼠标滚轮事件 首先,不同的浏览器有不同的滚轮事件.主要是有两种,onmousewheel(IE/Opera/Chrome支持,firefox不支持)和DOMMouseScroll(只有 ...

  4. 什么叫TLD、gTLD、nTLD、ccTLD、iTLD 以及几者之间的关系

    TLD TLD的全称是Top Level Domain,顶级域名,它是一个因特网域名的最后部分,也就是任何域名的最后一个点后面的字母组成的部分. 最早的顶级域名有:.com(公司和企业)..net(网 ...

  5. MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )

    --视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...

  6. Spring Cloud与Spring Boot的关系

    1.Spring Cloud是一个工具集:Spring   Cloud是在Spring    Boot的基础上构建的,用于简化分布式系统构建的工具集:使架构师在创建和发布微服务时极为便捷和有效. Sp ...

  7. perl6中函数参数(1)

    sub F($number is copy){ $number++; say $number; } F(); #下面是错误的 sub F($number){ $number++; say $numbe ...

  8. YUV颜色编码解析(转)

    原文转自 https://www.jianshu.com/p/a91502c00fb0

  9. Python学习笔记 - day10 - 正则表达式

    正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样 ...

  10. vue-实现倒计时功能

    JavaScript 创建一个 countdown 方法,用于计算并在控制台打印距目标时间的日.时.分.秒数,每隔一秒递归执行一次. msec 是当前时间距目标时间的毫秒数,由时间戳相减得到,我们将以 ...