Dijkstra-迪杰斯特拉
处理单源最短路径问题常用的算法
推荐:Dijkstra详解
类似的算法 Floyd 弗洛伊德,效率上并没有Dijkstra-迪杰斯特拉高
单源最短路
题目中如何实现 Dijkstra?
工具:邻接表 + 标记表 + 城市与 s 最短路径表
思路:在最优的条件下,枚举寻找下一个最优的条件(排除已经是最优的城市)。
由于每次循环都只能为一个城市找到最佳路径,所以必须重复进行 n-1 次循环(城市数量 n)。
#include<bits/stdc++.h>
using namespace std;
int len[2600][2600];
int dis[2600], n;
bool bj[2600] = {false};
const int Max = 1e9+7;
void init(){
for(int i=1; i<2600; i++)
for(int j=1; j<2600; j++){
if(i==j)
len[i][j]=0;
else
len[i][j]=Max;
}
return;
}
void Dijkstra(int s){
bj[s] = true;
for(int i=1; i<n; i++){
int u, Min = Max;
//寻找当前最优且没被走过的路径
for(int j=1; j<=n; j++)
if(dis[j]<Min&&!bj[j]){
Min = dis[j];
u = j;
}
//在最优的路径下找下一个可能最优的路径
bj[u] = true;
for(int j=1; j<=n; j++)
if(dis[j]>dis[u]+len[u][j])
dis[j] = dis[u]+len[u][j];
}
return;
}
int main(){
int m, s, t;
init();
scanf("%d%d%d%d", &n, &m, &s, &t);
while(m--){
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if(len[x][y]>z){
len[x][y]=z;
len[y][x]=z;
}
}
for(int i=1; i<=n; i++)
dis[i] = len[s][i];
Dijkstra(s);
printf("%d", dis[t]);
return 0;
}