弗洛伊德算法(Floyd)
简介:
主要用来解决任意两点间的最短路径的一种算法(不能解决带有“负权回路”即“负权环”的图,因为它没有最短路径)
时间复杂度为O(N3),空间复杂度为O(N2)
算法思路:
将相关数据用邻接矩阵储存(邻接矩阵详解),
若两个点间没有联系,则赋值为∞*之后对矩阵进行更新,每次选取一个点作为经过点,比较该路线与之前的大小,选取较小的,更新数据,重复以上操作。
例题展示
洛谷:B3647 【模板】Floyd
题目描述
给出一张由 n 个点 m 条边组成的无向图。
求出所有点对 (i,j) 之间的最短路径。
输入格式
第一行为两个整数 n,m,分别代表点的个数和边的条数。
接下来 m 行,每行三个整数 u,v,w,代表
u,v 之间存在一条边权为 w 的边。
输出格式
输出 n
n 行每行 n 个整数。
第 i 行的第 j 个整数代表从 i 到 j 的最短路径。
输入
4 4
1 2 1
2 3 1
3 4 1
4 1 1
输出
0 1 2 1
1 0 1 2
2 1 0 1
1 2 1 0
#include<bits/stdc++.h>//Floyd最短路径
using namespace std;
const int N=1e2+50;
const int M=1e9+20;
int a[N][N];
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
a[i][j]=M;
a[j][j]=0;//自己到自己点位距离为0
}//初始化邻接矩阵
int q,w,e;
for(int i=1;i<=m;i++)
{
cin>>q>>w>>e;
a[q][w]=a[w][q]=min(a[q][w],e);
}
for(int k=1;k<=n;k++)//以第K个点为经过点,进行遍历,选出最短路径
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
cout<<a[k][i]<<" ";
}cout<<endl;
}
return 0;
}