文章目录
- Floyd算法介绍
- Floyd算法思路
- 代码及讲解
Floyd算法介绍
Floyd算法是一种用于找出加权图中所有顶点间最短路径的动态规划方法。它通过逐步考虑每个顶点作为中转点,检查是否有更短路径。算法首先初始化一个权值矩阵,然后通过三层循环更新矩阵,直到找到最终的最短路径。文章提供了算法实例和代码实现,并指出Floyd算法能处理负权边但不能处理负环图,适用于小规模问题。
Floyd算法思路
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德。
核心思路: 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
算法过程:
1.从任意一条单边路径开始。左右两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2.对于每一对顶点u和v,看是否存在一个顶点w使得从u到w再到v比已知的路径更短,如果更短,则更新它。
代码及讲解
#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define PII pair<int,int>
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int d[1100][1100],p[1100][1100],m,n;
signed main()
{
IOS
memset(d,0x3f,sizeof d);
cin>>m>>n;
for(int i=1;i<=n;i++)
{
int a,b,c;
cin>>a>>b>>c;
d[a][b]=c;
d[b][a]=c;
}
for(int i=1;i<=m;i++)
d[i][i]=0;
for(int k=1;k<=m;k++)
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(d[i][j]>d[i][k]+d[k][j])
{
d[i][j]=d[i][k]+d[k][j];
p[i][j]=k;
}
}
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
cout<<d[i][j]<<" ";
cout<<endl;
}
return 0;
}