弗洛里德算法

思路

在这里插入图片描述
在这里插入图片描述

三重for循环实现图任意两点最短路径

#include<iostream>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int INF=50;
int n,m;   //适用于n<=10
int a[11][11];
int main (){
	  cin>>n>>m;
	  rep(i,1,n)
		 rep(j,1,n){
		 	if(i==j)
		 	 a[i][j] =0;
		 	 else
		   a[i][j] =INF;
	}
	  for(int i=1;i<=m;i++){
	  	int x,y,value;cin>>x>>y>>value;
	  	a[x][y]= value;
		}
		 //三重for循环
			for(int i=1;i<=n;i++) //插入点  
 			for(int j=1;j<=n;j++) //起点
  			for(int k=1;k<=n;k++){  //终点
  	 a[j][k] = min(a[j][i]+a[i][k],a[j][k]); 
   }
    for(int i=1;i<=n;i++){
     for(int j=1;j<=n;j++)
       cout<<a[i][j]<<" ";
       cout<<endl;
    }
}

输入:
6 8
1 2 1
2 3 1
2 4 7
3 4 8
4 5 4
2 6 2
6 4 3
3 5 15

我的一点点理解

A,B两点,添加一点C,影响到了dis(AB)就刷新为
dis(AB)=dis(AC)+dis(CB);
在这里插入图片描述
ps: 在点3和点5连接一条长15的边

分析一下:1-5=1-2-6-4-5最短路径是如何实现!?
那么三重for循环怎么实现两点最短路径呢?
一:以点6为例,当前2到4dis是7,添加了6,是的2到4的dis是5,更小了,替换他。
二:以点4为例, 没4点是,2到5的dis是1+15=16.添上ta,哎嘿2到5距离更小了
替换他。
发现没,
添加前是没有点6的中间路径(2-4),加上点6后对其它路径有影响修改
为(2-6-4),每次修改依据是啥呢?当然是改后路径比之前更短咯。
点4也是如此。
然后我们看:
我们在找1-5的最短路径时(起初我们不知道1-5怎么连是最短的),我们只有不断寻找两点间路径最短值,然后
将他们拼接起(拼积木一样),最后连成一条完整的1-2-6-4-5的最短路径。
这不就1-5的最短路径顺利得出来了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

axtices

谢谢您的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值