#include<iostream>
// 定义图中节点个数
#define V 9
using namespace std;
// dist:距离表,path:加入最短路径的节点标记为 true
// 找到距离表中最短路径长度的节点,且该节点未加入路径集
int minDistance(int dist[], bool path[]) {
int min = INT_MAX, minIndex;
for (int v = 0; v < V; v++) {
if (path[v] == false && dist[v] <= min) {
min = dist[v], minIndex = v;
}
}
return minIndex;
}
void printSolution(int dist[]) {
cout << "节点 \t 源点到该节点的距离" << endl;
for (int i = 0; i < V; i++)
cout << i << " \t\t" << dist[i] << endl;
}
void dijkstra(int graph[V][V], int src) {
int dist[V]; // 距离表,会存储从 src 到 i 的最短距离值
bool path[V]; // 路径表,如果节点 i 加入到路径表,则赋 true
// 初始化距离表和路径集合
for (int i = 0; i < V; i++) {
dist[i] = INT_MAX, path[i] = false;
}
// 源点到自身的距离是 0
dist[src] = 0;
// 目前距离表应该为 0,INF,INF...
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, path); // u 在首轮迭代时就是 src
path[u] = true;
for (int v = 0; v < V; v++) {
// 1. 未加入路径集
// 2. u 和 v 是有边的
// 3. src 到 v 是连通的
// 4. 如果把 v 加入路径集,距离表中到达 v 的距离值比当前小
if (!path[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v]; // 满足以上 4 个条件则更新距离表,否则不更新
}
}
}
printSolution(dist);
}
int main()
{
int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },
{ 4, 0, 8, 0, 0, 0, 0, 11, 0 },
{ 0, 8, 0, 7, 0, 4, 0, 0, 2 },
{ 0, 0, 7, 0, 9, 14, 0, 0, 0 },
{ 0, 0, 0, 9, 0, 10, 0, 0, 0 },
{ 0, 0, 4, 14, 10, 0, 2, 0, 0 },
{ 0, 0, 0, 0, 0, 2, 0, 1, 6 },
{ 8, 11, 0, 0, 0, 0, 1, 0, 7 },
{ 0, 0, 2, 0, 0, 0, 6, 7, 0 } };
dijkstra(graph, 0);
return 0;
}
Dijkstra 单源最短路径算法
于 2022-02-26 14:38:55 首次发布