1. 多源最短路和单源最短路
- 单源最短路是指从一个起点出发,到其他各个顶点的最短路径。
- 多源最短路是指图中任意两点之间的最短路径。
2. floyd算法原理
floyd是一个动态规划思路的算法,废话不多说,直接上图↓
- 如上通过2号(媒介的点)将1号(起点)与3号(终点)连接了起来。
- 不断地枚举起点、终点、媒介的点,更新边的长度。
3. floyd算法代码
以下代码是洛谷B3647模板题。
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[105][105];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=1e+9;//其实按题目1001就够了,不过多一点比赛时保险(1e+9=1000000000)。
}
}//初始化邻接矩阵。
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
a[u][v]=w;
a[v][u]=w;
}//输入邻接矩阵。
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)a[i][j]=0;//特判。
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);//更新。
}
}
}//floyd算法核心代码,一个O(n^3)的漫长的枚举过程。
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<' ';
}
cout<<'\n';
}//输出邻接矩阵。
}
以上代码解决了求无向图的最短路。🧡
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[105][105];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=1e+9;//其实按题目1001就够了,不过多一点比赛时保险(1e+9=1000000000)。
}
}//初始化邻接矩阵。
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
a[u][v]=w;
//a[v][u]=w;删去此行即可。
}//输入邻接矩阵。
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)a[i][j]=0;//特判。
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);//更新。
}
}
}//floyd算法核心代码,一个O(n^3)的漫长的枚举过程。
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<' ';
}
cout<<'\n';
}//输出邻接矩阵。
}
再经过以上一点点修改就可以求有向图了。🧡
floyd算法讲完了,作者正摆烂着度过一个漫长无聊的寒假,非常不容易,留下你的点赞再走吧!