算法思想:
将所有顶点分为 两个阵营 [S]和[V-S],其中[S]是已经确定下最小路径的点,[V-S]是待确定最短路径的点
不断地以[S]中的某个点作为中间点,改变[V-S]中某个点的路径。
代码如下:
#include "pch.h"
#include <iostream>
using namespace std;
void Dijkstra(int s,int n,int m);
void init_dij(void);
const int MAXV = 50, INF = 999999;
int S[MAXV];
int path[MAXV];
int arcs[MAXV][MAXV];//临界矩阵,代表两点间距离
int dist[MAXV];//每个顶点的最短距离
int main()
{
init_dij();
arcs[0][1] = 1; arcs[0][3] = 4; arcs[0][4] = 4;
arcs[1][3] = 2; arcs[2][5] = 1; arcs[3][2] = 2;
arcs[3][4] = 3; arcs[4][5] = 3;
for (int i = 0; i < 6; i++) {
arcs[i][i] = 0;
}
Dijkstra(0,6,8);
for (int i = 0; i < 6; i++) {
cout << dist[i] << endl;
cout << endl;
}
for (int i = 0; i < 6; i++) {
cout << path[i] << " ";
}
}
void init_dij() {
fill(S, S + MAXV, 0);//标记全置0
for (int i = 0; i < MAXV; i++) {
for (int j = 0; j < MAXV; j++)arcs[i][j] = INF;
}
}
void Dijkstra(int s,int n,int m) {
path[s] = s;//起点设置:认为他前置点为起点本身
for (int i = 0; i < n; i++) {//初始化所有点先连向起始点
if (arcs[s][i] != INF)path[i] = s;
}
for (int i = 0; i < n; i++) {
dist[i] = arcs[s][i];//初始化dist为从起始点s至第i个点的距离
}
S[s] = 1;//将初始点放入到S中
for (int i = 0; i < n; i++) {//进行n次循环
int MIN = INF;
int temp=-1;
for (int j = 0; j < n; j++) {//从[V-S]中寻找到dist最小的点
if (S[j] == 0 && dist[j] < MIN && dist[j]!=INF) {
MIN = dist[j];
temp = j;
}
}
if (temp != -1) {
S[temp] = 1;
//修改[V-S]中各顶点的路径:以刚才选中的点作为中间桥梁
for (int k = 0; k < n; k++) {
if (S[k] == 0 && dist[temp] + arcs[temp][k] < dist[k]) {
//对于[V-S]中的点,以temp做中间点后的路径长度变小,则发生替换
dist[k] = dist[temp] + arcs[temp][k];//修改第k个点的dist
path[k] = temp;
//然后下一轮循环时,它会作为该顶点的新属性,与其他点竞选,如果他是最小的则选入S
}
}
}
}
}