Floyd算法

it2022-05-09  30

Floyd算法(Floyd-Warshall algorithm)又称为弗洛伊德算法、插点法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

今天刷学校oj遇见一到题发现用弗洛伊德算法非常简单;

题目描述

给一张无向图G(U, E), 询问任意两点的最短距离。

 

输入

第一行两个整数n,m表示图中结点数和边的数量, 结点从1到n编号。

接下来m行,每行三个整数u,v,w表示u,v之间有一条距离为w的边。

接下来一行一个整数q,表示询问次数。

接下来q行每行两个整数u,v,表示询问u到v的最短距离, 如果u不能到达v输出-1。 

那么我们简单介绍一下弗洛伊德算法

简单来说弗洛伊德算法就是不断枚举,“借东风”,复杂度比较高

for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][k]+e[k][j] ) e[i][j]=e[i][k]+e[k][j]; 这是我的代码

#include<iostream>#include<cstdio>#include<algorithm> #include<cstring>using namespace std;const int M=1005;const int inf=0x3f3f;int n,m;int map[M][M];int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=1000;i++) for(int j=1;j<=1000;j++) map[i][j]=inf; for(int i=0;i<=1000;i++) map[i][i]=0; while(m--) { int u,v,w; cin>>u>>v>>w; map[u][v]=min(map[u][v],w); map[v][u]=map[u][v]; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) { map[j][k]=min(map[j][k],map[j][i]+map[i][k]); } int y;cin>>y; while(y--) { int q,e;cin>>q>>e; cout<<map[q][e]<<endl; } return 0;}

转载于:https://www.cnblogs.com/flyljz/p/11000209.html


最新回复(0)