Floyed-Warshall【弗洛伊德算法】

首先介绍一下有关最短路径的知识c++

从某顶点出发,沿图的边到达另外一顶点所通过的路径中,各边上权值之和最小的一条路径叫作最短路径。解决最短路的问题有如下算法,Dijkstra算法,Bellman-Ford算法,Floyed算法和SPFA算法等。算法

                                                                                         ——百度百科数组

通俗点来讲就是在图中的两点之间的最短距离(只不过这里规定了路径而已)spa


 

那么,咱们的问题来了code

什么是图? 

图(Graph【这也是为何oier们一般设g数组的缘由】)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。对象

简洁来讲,就是一个神奇的表示关系的图表(别告诉我大家不知道图表是什么blog

什么是权值?

在数学领域,权值指加权平均数中的每一个数的频数,也称为权数或权重。ci

也就是这条边的价值【相似于长度】get

 


那么这里对于一些基本的概念性的知识应该是没有什么问题了数学

说实话这个算法是用来求多源最短路径的算法。

                  ——gh

                    ——题记【并Orz一波】

这里的算法原理能够看作是一个相对来讲和DP有些关系的DP

这个神奇的算法的复杂度井然是O(n3)【使人十分慌张

但这个算法也有其必定的优势:


1.能够计算图中任意两点间的最短路径

2.适用于负边权的状况

…………【好处不少,咱们要有一双善于发现好处的眼睛

 

核心代码相似于这个

for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if((i!=j)&&(i!=k)&&(j!=k)&&(f[i][k]+f[k][j]<f[i][j]))//这里是一步松弛操做,使得f[i][j]是最短的 { f[i][j]=f[i][k]+f[k][j]; } } } }

其实很好理解

这里放一个最简单的例题给你们刷一刷吧

【洛谷P1744 采购特价商品】

这里很好理解

就直接放代码了

#include<bits/stdc++.h>
using namespace std; int a[101][3]; double f[101][101]; int n,i,j,k,x,y,m,s,e; int main() { cin>>n; for(i=1;i<=n;i++) { cin>>a[i][1]>>a[i][2]; } cin>>m; memset(f,0x7f,sizeof(f));//将这个矩阵初始化一下 for(i=1;i<=m;i++) { cin>>x>>y; f[y][x]=f[x][y]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));//这就是两点间距离公式了【注意须要强制类型转换】,由于是无向的,因此f[x][y]=f[y][x] } cin>>s>>e; for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if((i!=j)&&(i!=k)&&(j!=k)&&(f[i][k]+f[k][j]<f[i][j])) { f[i][j]=f[i][k]+f[k][j]; } } } } printf("%.2lf",f[s][e]); }
相关文章
相关标签/搜索