Floyd最短路径算法(参考王道数据结构书籍思路)
Floyd算法的实现思路主要就是简单的动态规划,把一个大的问题化解为一个一个的子问题进行求解,我认为王道的书籍已经讲的足够清晰,所以不做赘述
博文是主要实现王道机构学长所说的path矩阵递归找到完整路径,也是一个很简单递归,主要是将起点和终点之间的其他连接结点找到,所以用递归类似于二分,找到一个中间结点之后再对左右分别进行递归。
本文提供了完整的实现代码,以及两组实验数据用例。(仅初学Floyd算法使用,没有提供优化思路)
#include <iostream>
#include <stdio.h>
#include <string>
#define N 10000
#define INF 1000009
int A[100][100];
int path[100][100];
int n;
void printData(int data[][100]){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(data[i][j]!=INF){
printf("%4d",data[i][j]);
}
else printf(" INF");
}
printf("\n");
}
printf("\n");
}
void Floyd(){
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(A[i][j]>A[i][k]+A[k][j]){
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
}
}
void findpath(int st,int ed){
if(A[st][ed]<INF && path[st][ed]==(-1)){
printf("->>%d",ed);
}
else{
int mid = path[st][ed];
findpath(st,mid);
findpath(mid,ed);
}
}
void find_FloydPath(int st,int ed){
printf("%d点到%d点的最短路径为:%d",st,ed,st);
findpath(st,ed);
}
int main(int argc, char *argv[]) {
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
if(i!=j) A[i][j] = INF;
else A[i][j]=0;
path[i][j] = -1;
}
}
int m;
int p,q,s;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d %d %d",&p,&q,&s);
A[p][q]=s;
}
Floyd();
printData(A);
printData(path);
int st,ed;
scanf("%d %d",&st,&ed);
find_FloydPath(st,ed);
return 0;
}
实验用例1
实验用例2
实验用例2实验结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/2daf10b934b44b48b2a37dbc7e41a4a1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAYWh1YeeahOWktOWPkQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)