算法导论 第二十五章:每对顶点间的最短路径

Floyd-Warshall 算法

   设G的顶点为V={1,2,...,n},对于每个k考虑顶点的一个子集{1,2,...,k}。对于任意一对顶点i,j ∈ V,考察 从i到 j 且中间顶点皆属于集合{1,2,...,k}的所有路径,设p是其中的一条最小权值路径:

1)如果k不是路径p中的中间顶点,则p的所有中间顶点皆在集合{1,2,...,k-1}中。因此从顶点i到顶点j且满足所有中间顶点皆属于集合{1,2,...k-1}的一条最短路径,也同样从顶点i到顶点j且满足所有中间顶点皆属于集合{1,2,...,k}的一条最短路径。

2)如果k是路径p的中间顶点,那么p可以分解成两部分,如下图。p1是从i到k的一条最短路径,且其所有中间顶点属于集合{1,2,...,k}。因为顶点k不是路径p1上的一个中间顶点,所以p1是从i到k的一条最短路径,且其所有中间顶点均属于集合{1,2,...,k-1}.类似地,p2是从顶点k到顶点j的一条最短路径,且其所有中间顶点均属于集合{1,2,...,k-1}

算法导论 第二十五章:每对顶点间的最短路径_第1张图片

为从顶点i到顶点j,且满足所有中间顶点皆属于集合{1,2,...,k}的一条最短路径的权值,则有:

其中

伪代码如下:

算法导论 第二十五章:每对顶点间的最短路径_第2张图片

运行时间:O(V^3)


完整代码:

#include
#include
#include
using namespace std;

#define DG  0 
#define UDG 1
#define NIL -1

typedef int vType;
typedef int wType;
typedef struct edge{
	vType u;   // the start of edge
	vType v;   // the end of edge
	wType w;   //the weight of edge
	}edge;
typedef struct MGraph{
	int vNum;
	int eNum;
	vType *V;
	edge *E;
	wType **W;   //the weight matrix
	int kind;    // the type of the graph
	}MGraph;



void Matrix_Print(wType **M,int n)
{
	for(int i=0; i< n; i++)
	{
		for(int j=0; j=INT_MAX || tD[k][j]>=INT_MAX || tD[i][k]+tD[k][j]>= INT_MAX)
					D[i][j] = tD[i][j];
				else
					D[i][j] = min(tD[i][j],tD[i][k]+tD[k][j]);
				}
		cout<<"The "<= INT_MAX)
				{
					Pie[i][j] = tPie[i][j];
					continue ;
					}
				if(tD[i][j] <= tD[i][k]+tD[k][j])
						Pie[i][j] = tPie[i][j];
				else
						Pie[i][j] = tPie[k][j];
				}
		cout<<"The "<

运行结果:

算法导论 第二十五章:每对顶点间的最短路径_第3张图片

算法导论 第二十五章:每对顶点间的最短路径_第4张图片算法导论 第二十五章:每对顶点间的最短路径_第5张图片

你可能感兴趣的:(Data,Structure,and,Algorithms)