记录_floyd最短路径

本文介绍了Floyd算法用于寻找图中所有顶点之间的最短路径。通过不断更新两点间路径,确保经过任意点的最短距离。核心在于三层循环更新二维数组,使得每个点到其他点的路径始终保持最短。并提供了示例代码展示具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

floyd算法:

    假设一个点直接到另一个点的距离比一个点经过另一个点到另一个点的距离要长所以短距离就是经过这个点的距离,再假设一个点经过两个点到另一个点的总距离要比经过一个点的总距离要短,比如S(a-b-c-d)<S(a-c-d)因为在第一次更新中已经更新了a-b的短距离,所以只要在检测a-b-c的距离比a-c要短就可了。

现在假设有5个点,标记为a,b,c,d,e。所以检验各个点经过另一个点到另一个点的距离大小,用二维数组表示,比如从b-c检测b-a-c的总距离有没有比b-c的总距离短表示为:

 

map[b][c]=min {map[b][c],map[b][a]+map[a][c]}

 

map[b][a]为b-a的距离map[a][c]为a-c的距离通过更新这些值令他们保持最小的值

通过公式我们可以得出首先要便利任意一个点到另外一个点的方法,这个在二维数组中可以用一个嵌套循环来实现:

 

for i = a to e

for j = a to e

map[i][j]//为访问的数组的所有元素

 

而要表现那个公式就要一个判断语句:

 

if map[i][j]>map[i][k]+map[k][j]

map[i][j]=map[i][k]+map[k][j]

 

注:其中 map[i][k] 和 map[k][j] 可能已经在其他次更新中得到最小值 

map[i][k]=map[i][k1]+map[k1][k]

map[i][k]=map[k][j1]+map[j1][j]

map[b][c]=min {map[b][c],map[b][a]+map[a][c]}

已经是在前面的运算中是最小值了

 

但要测试经过不同各个点的最短距离既可以在嵌套循环外面再套一个循环遍历完所有点,在外面遍历所有点的过程中就保证了一个点到另外一个点的距离总为最短距离,所以不管经过几个点都保证是最短距离:

 

for k = a to e

for i = a to e

for j = a to e

if map[i][j]>map[i][k]+map[k][j]

map[i][j]=map[i][k]+map[k][j]

 

注:在这个二维数组中一个点到另一个不可达点距离设为 无穷大 ,而该点到自身的距离设为 0 。

 const int size=9;

const int MAX=1000000;

int map[size][size]={

{ 0,4,MAX,MAX,MAX,MAX,MAX,8,MAX },

{ 4,0,8,MAX,MAX,MAX,MAX,11,MAX },

{ MAX,8,0,7,MAX,4,MAX,MAX,2 },

{ MAX,MAX,7,0,9,14,MAX,MAX,MAX },

{ MAX,MAX,MAX,9,0,10,MAX,MAX,MAX },

{ MAX,MAX,4,14,10,0,2,MAX,MAX },

{ MAX,MAX,MAX,MAX,MAX,2,0,1,6 },

{ 8,11,MAX,MAX,MAX,MAX,1,0,7 },

{ MAX,MAX,2,MAX,MAX,MAX,6,7,0 }

};

for(int k=0;k<size;k++){

for(int i=0;i<size;i++){

for(int j=0;j<size;j++){

if(map[i][j]>map[i][k]+map[k][j]){

map[i][j]=map[i][k]+map[k][j];

}

}

}

}

floyd核心:更新各个点到各个点(另)的已知最短距离 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值