数据结构—顶点之间的最短路径Floyd算法

Floyd算法

问题描述:对于一个各边权值均大于零的有向图,对每一对顶点i≠j,求出顶点i与顶点j之间的最短路径和最短路径长度。

多源最短路径问题: Floyd算法

假设有向图G=(V,E)采用邻接矩阵存储。设置一个二维数组A用于存
放当前顶点之间的最短路径长度,分量A[I] [j] 表示当前顶点i  j的最短路
径长度。
递推产生一个矩阵序列:
A0  A1  …  Ak  …  An-1。
算法:迭代(递推)思路
Ak[i][j]: i  j的路径上所经过的顶点编号不大于k的最短路径长度。

算法设计(解决2个问题)
(1)用二维数组A存储最短路径长度:
Ak[i][j]表示考虑顶点0~k后得出的i  j的最短路径长度。
An-1[i][j]表示最终的i  j的最短路径长度。

(2)用二维数组path存放最短路径:
pathk[i][j]表示考虑顶点0~k后得出的i  j的最短路径。
pathn-1[i][j]表示最终i  j的最短路径。


	void Floyd(MatGraph g) //求每对顶点之间的最短路径
	{
		int A[MAXVEX][MAXVEX]; //建立A数组
		int path[MAXVEX][MAXVEX]; //建立path数组
		int i, j, k;
	for (i=0;i<g.n;i++) 
		for (j=0;j<g.n;j++) 
		{
			 A[i][j]=g.edges[i][j];
			if (i!=j && g.edges[i][j]<INF)
				path[i][j]=i; //i和j顶点之间有一条边时
			else //i和j顶点之间没有一条边时
				path[i][j]=-1;
		}
		for (k=0;k<g.n;k++) //求Ak[i][j]
		{ 
			for (i=0;i<g.n;i++)
			for (j=0;j<g.n;j++)
			if (A[i][j]>A[i][k]+A[k][j]) //找到更短路径
			{ 
				A[i][j]=A[i][k]+A[k][j]; //修改路径长度
				path[i][j]=path[k][j]; //修改最短路径为经过顶点k 
			}
		 } 
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值