#include <iostream>
#include <vector>
#include <climits>
using namespace std;
// Dijkstra 算法函数
vector<int> dijkstra(const vector<vector<int>>& graph, int source) {
int n = graph.size();
// 用于记录从源点到各个顶点的最短距离,初始化为无穷大
vector<int> dist(n, INT_MAX);
// 用于标记顶点是否已确定最短路径,初始为 false
vector<bool> sptSet(n, false);
// 源点到自身的距离为 0
dist[source] = 0;
// 对每个顶点进行处理
for (int count = 0; count < n - 1; ++count) {
// 从未确定最短路径的顶点中选择距离最小的顶点
int minDist = INT_MAX, minIndex;
for (int v = 0; v < n; ++v) {
if (!sptSet[v] && dist[v] <= minDist) {
minDist = dist[v];
minIndex = v;
}
}
// 标记该顶点为已确定最短路径
sptSet[minIndex] = true;
// 更新与该顶点相邻的顶点的最短距离
for (int v = 0; v < n; ++v) {
if (!sptSet[v] && graph[minIndex][v] && dist[minIndex] != INT_MAX &&
dist[minIndex] + graph[minIndex][v] < dist[v]) {
dist[v] = dist[minIndex] + graph[minIndex][v];
}
}
}
return dist;
}
int main() {
// 示例图的邻接矩阵
vector<vector<int>> graph = {
{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}
};
int source = 0; // 源点
vector<int> dist = dijkstra(graph, source);
// 输出从源点到各个顶点的最短距离
cout << "Vertex \t Distance from Source" << endl;
for (int i = 0; i < dist.size(); ++i) {
cout << i << " \t " << (dist[i] == INT_MAX ? "INF" : to_string(dist[i])) << endl;
}
return 0;
}
最短路问题之dijikstra算法
于 2024-10-15 23:33:32 首次发布