最短路径(啊哈!算法)
任意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算法不能解决负权回路问题
永远找不到最短路径