Dijkstra算法用于解决最短路问题,其时间复杂度为o(n^2)。
该算法大体步骤如下:
设定一个顶点集合,首先将源点加入集合内,接下来找距离远点最近距离的一个点,将其加入到集合内,用它来更新不在集合内的所有与它相连的源点能到达的点的距离,然后不断进行这个操作,n-1次之后就更新完了所有的点。
查找不在集合内的源点所能到达的最近的点并加入集合:
for(int j = 1; j <= poi_num; j++){
if(!vis[j] && Min > d[j]){
poi_temp = j;
Min = d[j];
}
}
vis[poi_temp] = 1;
用它来更新相连的不在集合内的点与源点之间的距离:
for(int j = 1; j <= poi_num; j++){
if(!vis[j] && d[j] > d[poi_temp] + map[poi_temp][j]){
d[j] = d[poi_temp] + map[poi_temp][j];
}
}
完整代码如下:
#include <cstdio>
#include <iostream>
using namespace std;
const int Max = 0x3f3f3f3f;
bool vis[1005];
int map[1005][1005];
int d[1005];
void init(int n){
for(int i = 0; i <= n; i++){
d[i] = Max;
for(int j = 0; j <= n; j++){
map[i][j] = Max;
}
}
memset(vis, 0, sizeof(vis));
}
int main() {
int poi_n, edge_n, poi_bgn, poi_nd;
cin >> poi_n >> edge_n;
init(poi_n);
for (int i = 0; i < edge_n; i++) {
int poi_a, poi_b, len_c;
cin >> poi_a >> poi_b >> len_c;
map[poi_a][poi_b] = len_c;
map[poi_b][poi_a] = len_c;
}
cin >> poi_bgn >> poi_nd;
for (int i = 1; i <= poi_n; i++) {
d[i] = map[poi_bgn][i];
}
d[poi_bgn] = 0;
vis[poi_bgn] = 1;
for (int i = 1; i < poi_n; i++) {
int Min = Max;
int poi_temp;
for (int j = 1; j <= poi_n; j++) {
if (!vis[j] && d[j] < Min) {
poi_temp = j;
Min = d[j];
}
}
vis[poi_temp] = 1;
for (int j = 1; j <= poi_n; j++) {
if (!vis[j] && map[poi_temp][j] + Min < d[j]) {
d[j] = map[poi_temp][j] + Min;
}
}
}
cout << d[poi_nd] << endl;
return 0;
}