每一对顶点间最短路径的Floyd算法

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的路径.

参考代码:

 1 #include<stdio.h>
 2 #define MAXSIZE 6//带权有向图中顶点的个数
 3 #define INF 32767
 4
 5 void Ppath(int path[][MAXSIZE],int i,int j)//前向递归查找路径上的顶点,MAXSIZE为常数
 6 {
 7  int k;
 8  k=path[i][j];
 9  if(k!=-1)
10  {
11      Ppath(path,i,k);//找顶点vi的前一个顶点vk
12      printf("%d->",k);//输出顶点vk序号k
13      Ppath(path,k,j);//找顶点vk的前一个顶点vj
14  }
15 }
16
17 void Dispath(int A[][MAXSIZE],int path[][MAXSIZE],int n)//输出最短路径的函数
18 {
19     int i,j;
20     for(i=0;i<n;i++)
21         for(j=0;j<n;j++)
22             if(A[i][j]==INF)//INF为一极大常数
23             {
24                 if(i!=j)
25                     printf("从%d到%d没有路径!\n",i,j);
26             }
27             else//从vi到vj有最短路径
28             {
29                 printf("从%d到%d的路径长度:%d,路径:",i,j,A[i][j]);
30                 printf("%d->",i);//输出路径上的起点序号i
31                 Ppath(path,i,j);//输出路径上的各中间点序号
32                 printf("%d\n",j);//输出路径的终点序号j
33             }
34 }
35
36 void Floyd(int gm[][MAXSIZE],int n)//Floyd算法
37 {
38     int A[MAXSIZE][MAXSIZE],path[MAXSIZE][MAXSIZE];
39     int i,j,k;
40     for(i=0;i<n;i++)
41         for(j=0;j<n;j++)
42         {A[i][j]=gm[i][j];//A-1[i][j]置初值
43          path[i][j]=-1;//-1表示初始时最短路径不经过中间顶点
44         }
45         for(k=0;k<n;k++)//按顶点编号k递增的次序查找当前顶点之间的最短路径长度
46             for(i=0;i<n;i++)
47                 for(j=0;j<n;j++)
48                     if(A[i][j]>A[i][k]+A[k][j])
49                     {A[i][j]=A[i][k]+A[k][j];//从vi到vj经过vk时路径长度更短
50                      path[i][j]=k;//记录中间顶点Vk的编号
51                     }
52                     Dispath(gm,path,n);//输出最短路径
53 }
54
55 void main()
56 {
57     int g[MAXSIZE][MAXSIZE]={{INF,20,15,INF,INF,INF},{2,INF,INF,INF,10,30},{INF,4,INF,INF,INF,10},
58     {INF,INF,INF,INF,INF,INF},{INF,INF,INF,15,INF,INF},{INF,INF,INF,4,10,INF}};
59     Floyd(g,MAXSIZE);
60 }     

输出结果:

时间: 2024-10-05 05:06:03

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

最短路径--弗洛伊德算法[求任意一对顶点间的最短路径]

转自大神:https://www.cnblogs.com/wangyuliang/p/9216365.html !!!!!!!!!!!!!!!!!!!!!!!!!注意             迪杰斯特拉算法和弗洛伊德算法(求最短路径) 都是有向图!!!!单边的 暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向

最短路径之Floyd算法

Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floyd算法是一种在有权图中(有确定的非负的权值,不能存在环路)查找最短路径的算法.该算法的一次简单执行可以找出任意结点之间的最短路径(尽管它没有返回路径的具体信息). 思想: Floyd算法通过比较图中任意两点间所有可能存在的路径长度得到最短路径长度. 我们定义一个函数shortestPath(i,j,

哈理工oj 1348 最短路径 (floyd算法)

<p>最短路径 </p><p>Time Limit: 1000 MS Memory Limit: 32767 K </p><p>Total Submit: 208(28 users) Total Accepted: 31(20 users) Rating:  Special Judge: No   Description 给出一个有向带权图G,针对该图有如下的两种操作: (1)标记该图的一个点 (2)找到两点间的只通过已标记点的最短路径长度<

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 解决问题的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 之前已经对Dijkstra算法做了介绍(不懂的可以看这篇博客:Dijkstra算法详解),所以这篇博客打算对Floyd算法做

最短路径问题——floyd算法

floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法,只不过它的时间复杂度高,为o(v^3),用的时候需要谨慎. floyd的精髓部分在于实现其思想的三个for循环,而它的主要思想:如果存在一个点k,使得dis[s][t]<dis[s][k]+dis[k][t],那么我们就更新dis[s][t]. #include<iostream>//fl

HDU 1217 Arbitrage(最短路径,Floyd算法)

Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys

最短路径之所有顶点间最短路径(图片格式)

最短路径—Floyd算法

Floyd算法 所有顶点对之间的最短路径问题是:对于给定的有向网络G=(V,E),要对G中任意两个顶点v,w(v不等于w),找出v到w的最短路径.当然我们可以n次执行DIJKSTRA算法,用FLOYD则更为直接,两种方法的时间复杂度都是一样的. 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包.Floyd-Warshall算法的时间复杂度

数据结构之---C语言实现最短路径之Floyd(弗洛伊德)算法

//此代码综合网络上的代码. //弗洛伊德算法Floyd代码 //杨鑫 #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 //最大顶点数 #define MAX_INT 10000 //无穷大 typedef int AdjType; typedef struct { int pi[MAX_VERTEX_NUM]; //存放v到vi的一条最短路径 int end; }PathType; typedef