萌新の——弗洛里德算法

it2023-02-19  103

三重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)