最短路径(Floyd)

给定带权有向图 G=(V, E),  对任意顶点vi,vj 属于V,(i!=j) 求顶点vi到顶点vj的最短路径

解决办法: 弗洛伊德提出的求各个顶点之间的最短路径算法-----Floyd算法

基本思想:(利用循环,依次把0,1,2,......n顶点添加到路径上看路径权值矩阵是否发生变化)                      

路径矩阵表示的是任意两个顶点之间的权值

1.用图中的权值去初始化A[][]数组,  将path[][]全部初始化为-1;

首先对于n个顶点的图G,求任意一对顶点 Vi --> Vj之间的最短路径,可以分为下面几个阶段。

# 初始:不允许在其他顶点中转,最短路径是??                                                                        (最短路径就是图中权值组成的n*n的矩阵,  n代表顶点个数)

#0: 若允许V0中转, 最短路径是?

#1:若允许V0,V1中转,最短路径是?           ...........

#n-1: 若允许V0, V1,V2,........V(n-1)中转,最短路径是

例如, 图结构为:

 初始化A[][]数组 和 path[][] 数组.

首先需要一个A[]矩阵和path[]矩阵;

有n个顶点,所以需要循环n趟。
for(int k=0; k<n; k++){     //有n个顶点,用来表示将n个顶点一次加入
	for(int i=0; i<n; i++){         
		for(int j=0; j<n; j++){          //这两层循环用来看A[][]数组和path[]数组
			 //如果加入k顶点后,i到k到j的权值 小于 i到j的权值,则需要更新A[][]数组和path[][]数组
            if(A[i][j]>A[i][k]+A[k][j]){  
				A[i][j]=A[i][k] + A[k][j];
				path[i][j]=k; 
			}	
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值