题目描述
n个城市间有m条单向公路,求任意两城市间最短路径
题目来源【坐在马桶上看算法】算法6:只有五行的Floyd最短路算法
题目思路
- Flyod用于求多源最短路径问题(不能有负权边)
- 若两城市为编号1和n,求最短路径看1直接到n距离,1由1中转到n,1由2中转到n…其实也是个动态规划问题,两点间距离看看通过中转是否可以比目前的距离更短,不断去更新
代码模板
#include <iostream>
#include<stdio.h>
using namespace std;
#define inf 0x3f3f3f3f
#define max 10
int dis[max][max];
int main() {
//freopen("in.txt","r",stdin);
int n,m;
cin>>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 a,b,w;
for(int i=1;i<=m;i++){
cin>>a>>b>>w;
dis[a][b]=w;
}
//flyod核心五行代码
for(int k=1;k<=n;k++){//代表中转顶点从1到n
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]>dis[i][k]+dis[k][j]){
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
//输出最短路径矩阵
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<dis[i][j]<<" ";
}
cout<<endl;
}
//fclose(stdin);
return 0;
}
- 输入
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12 - 输出
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0