算法分析与设计 最短路 Floyd

算法分析与设计

最短路 Floyd算法

问题描述:

给出一张带权的的图,边的权值可以理解为两点之间的距离。一张图中任意两点间会有不同的路径相连。最短路就是指连接两点的这些路径中最短的一条。

算法思路:

Floyd:
一个有n个点,每次选取一个点k做为中间点,更新其他点的距离,即dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]).当每个点都作为中间点更新过所有的边时,所有的路劲距离皆为最短路劲。
在这里插入图片描述
以上图为例,当2为中间点时,dis[1][3]=dis[1][2]+dis[2][3]=5<dis[1][3]=6.其他点为中间点时同理。

核心伪代码:

void Floyd(){
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(mp[i][j]>mp[i][k]+mp[k][j])
					mp[i][j]=mp[i][k]+mp[k][j];
}


时间复杂度:

Floyd三重for,O(n^3)。

源码:

github:https://github.com/SpiritDemon-max/myText/blob/master/Floyd.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值