弗洛伊德是用于求多源(任意点到任意点)最短路径的绝佳方法
(Dijkstra是单源,某个点到任意点)
一般用邻接矩阵存储
主要是三层循环,以k,i,j举例
k在最外层循环,表示节点个数
i、j在里面,表示顶点对,即实现对邻接矩阵的遍历
主要功能函数如下:
for(int k=1; k<=n; k++) //遍历每个点
for(int i=1; i<=n; i++) //遍历每条边
for (int j = 1; j <= n; j++){
if (dis[i][k] + dis[k][j] < dis[i][j]) {
dis[i][j] = dis[i][k] + dis[k][j]; //松弛操作
path[i][j] = k; //保存j前驱结点k
}
}
path[ ][ ]数组是为了方便记录中间节点,可以取舍
模板题:B3647 【模板】Floyd
就是很模板的模板
完整AC代码如下:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
int n,m;
int u,v,w;
int gra[105][105];
int main(){
cin>>n>>m;//n代表点的个数,m代表边的个数
memset(gra,INF,sizeof(gra));
for(int i=1;i<=n;i++) gra[i][i]=0;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
gra[u][v]=w;
gra[v][u]=w;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
gra[i][j]=min(gra[i][j],gra[i][k]+gra[k][j]);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<gra[i][j]<<" ";
cout<<endl;
}
return 0;
}
看到了一个弗洛伊德的妙用,感觉很新奇,大家可以参考学习一下:
弗洛伊德(Floyd)算法c++版