最短路径(啊哈!算法)
任意2个点直接的最短路径:
首先分析确定2个点之间的最短路径:
比如A到B,要缩短A到B的路径就需要引入一个中转点K,有时可能需要多个中转点。A->k1->k2->B
如果不允许引入中转点那么A到B的最短路径就是A->B


插入1号城市,更新路径:

插入1,2城市,更新路径

求任意2点的最短路径就是求任意2点经过前K个点的最短路径
#include<iostream>
using namespace std;
int map[50][50];
int book[50];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i == j){
map[i][j]=0;
}else{
map[i][j]=999999;
}
}
}
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
map[a][b]=c;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(map[j][i]+map[i][k] <map[j][k] ){
map[j][k]=map[j][i]+map[i][k];
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j!=n){
cout<<map[i][j]<<' ';
}else{
cout<<map[i][j]<<endl;
}
}
}
return 0;
}

时间复杂度O(N^3),Floyd算法不能解决负权回路问题

永远找不到最短路径
浙公网安备 33010602011771号