
// Dijkstra算法的实现函数
// 参数:图graph,节点数n,起始节点source
vector<int> dijkstra(const vector<vector<Edge>>& graph, int n, int source) {
// 距离数组,用于存储源点到每个节点的最小距离,初始化为无穷大
vector<int> distances(n, numeric_limits<int>::max());
// 标记数组,用于判断节点是否已经被优化
vector<bool> visited(n, false);
// 小根堆优先队列,用于快速获取未访问节点中距离最小的节点
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minHeap;
// 初始化源点的距离为0,并将其加入优先队列
distances[source] = 0;
minHeap.push({0, source});
// 主循环,当优先队列不为空时执行
while (!minHeap.empty()) {
// 从优先队列中取出距离最小的节点
int current_distance = minHeap.top().first;
int current_node = minHeap.top().second;
minHeap.pop();
// 如果当前节点已经被访问过,则跳过
if (visited[current_node]) continue;
// 标记当前节点为已访问
visited[current_node] = true;
// 遍历当前节点的所有邻接边
for (const Edge& edge : graph[current_node]) {
int neighbor = edge.to;
int weight = edge.weight;
// 计算通过当前节点到达邻居节点的距离
int new_distance = current_distance + weight;
// 如果计算出的新距离小于已知的距离,则进行距离更新
if (new_distance < distances[neighbor]) {
distances[neighbor] = new_distance;
// 将邻居节点和更新后的距离加入优先队列
minHeap.push({new_distance, neighbor});
}
}
}
return distances; // 返回源点到各个节点的最短距离
}