任何遗漏、错误、疑问、建议,请在评论区指出哦~
希望这篇文章可以帮助到你,谢谢你阅读它
Floyed 算法
Floyed-Warshall 算法,简称 Floyed,是一种基于动态规划思想的多源最短路算法,其中“多源”是指,可以计算从多个结点为起点出发的情况。
缺陷:时间复杂度为 。
step1:定义
定义 dist[k][i][j] 为,从 出发,经过
到结点
的最短路径长度。
step2:状态转移
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
代码实现
对于板题:洛谷 B3647 【模板】Floyd
#include<bits/stdc++.h>
using namespace std;
int n,m;
int dis[103][103];
const int INF=0x3f3f3f3f;
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(i==j) dis[i][j]=0;
else dis[i][j]=INF;//初始化为无穷大
}
}
int x,y,w;
for(int i=0;i<m;i++) {
scanf("%d%d%d",&x,&y,&w);
dis[y][x]=dis[x][y]=min(dis[x][y],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 && i!=k && j!=k)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//更新最短路长度
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++)
printf("%d ",dis[i][j]);//输出从i到j的最短路径长度
cout<<'\n';
}
return 0;
}
Dijkstra 算法
Dijkstra 算法,是一种经典的,基于贪心的单源最短路径算法。适用于非负权图。
step1:核心步骤
-
维护两个集合:已确定最短路径的顶点集合
和未确定的集合


8971

被折叠的 条评论
为什么被折叠?



