最短路问题
有4种算法+广搜
分为单源最短路和多源最短路
- floyd算法 多源最短路 O(n^3)
- Dijkstra 单源最短路 O
- ford算法
- johnson算法
优化算法
- SPFA算法 单源最短路 O(n^2)ford算法的队列优化算法
而最短路问题又有很多种,比如
- 最小环
- 哈密顿回路
- 最小生成树
弗洛伊德算法Floyd
https://blog.csdn.net/Harington/article/details/81982299
定义g[i][j]表示i到j的最短路径,k是中介,i通过k到达j,指的是,只允许经过第k个结点
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(g[i][k]==INF)continue;//优化时间复杂度
for(int j=1;j<=n;j++){
if(g[i][j]>g[i][k]+g[k][j]){
g[i][j]=g[i][k]+g[k][j];
}
}
}
}
时间复杂度是O(n^3),对于大数据不合适,适合与n在100以内的数据
第一行输入结点数n和边数m
接下来的m行输入无向边情况
表示u与v相互连接,且距离为d,路费为p
最后输入a,b,求a到b的最短距离,当距离有多条时,输出路费最小的
利用Floyd算法实现多源最短路
本代码没有实现距离多条时,输出路费最小,且n<1000,m<10000;对于O(n^3)时间太慢
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1005;
const int INF=10000000;
int g[maxn][maxn];
int mo[maxn][maxn];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)==2&&n&&m){
for(int i=1;i<=n;i++){//初始化
for(int j=1;j<=n;j++){
g[i][j]=INF;
}
}
for(int i=0;i<m;i++){
int u,v,d,p;
scanf("%d%d%d%d",&u,&v,&d,&p);
g[u][v]=d;
g[v][u]=d;
mo[u][v]=p;
mo[v][u]=p;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(g[i][k]==INF)continue;
for(int j=1;j<=n;j++){
if(g[k][i]==INF)continue;
if(g[i][j]>g[i][k]+g[k][j]){
g[i][j]=g[i][k]+g[k][j];
mo[i][j]=mo[i][k]+mo[k][j];
}
}
}
}
int s,t;
scanf("%d%d",&s,&t);
printf("%d %d\n",g[s][t],mo[s][t]);
}
return 0;
}