// 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; // 返回源点到各个节点的最短距离
}