9665 . 综合题 Puls

完善程序(1)特殊最短路

给定一个含N个点、M 条非负带权无向图,起点 S、终点 T。至多选择一条边为"免费边":第一次经过该边费用为 0,再次经过按原权计费。求从S到T的最小总费用。补全以下程序。

#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

const long long INF = 1e18;

struct Edge {
    int to;
    int weight;
};

struct State {
    long long dist;
    int u;
    int used_freebie; // 0 for not used, 1 for used
    bool operator > (const State & other) const {
        return dist > other.dist;
    }
};

int main() {
    int n, m, s, t;
    cin >> n >> m >> s >> t;

    vector < vector < Edge >> adj(n + 1);
    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
    }

    vector < vector < long long >> d(n + 1, vector < long long > (2, INF));
    priority_queue < State, vector < State > , greater < State >> pq;

    d[s][0] = 0;
    pq.push({0,s,①______});

    while (!pq.empty()) {
        State current = pq.top();pq.pop();
        long long dist = current.dist;
        int u = current.u;
        int used = current.used_freebie;

        if (dist > ②______) {
            continue;
        }

        for (const auto & edge: adj[u]) {
            int v = edge.to;
            int w = edge.weight;

            if (d[u][used] + w < ③______) {
                ③______ = d[u][used] + w;
                pq.push({③______,v,used});
            }

        if (used == 0) {
            if (④______ < d[v][1]) {
                d[v][1] = ④______;
                pq.push({d[v][1],v,1});
            }
        }
    }

 }

    cout << ⑤______ << endl;
    return 0;
}
34 . (单选题)

①处应填?

35 . (单选题)

②处应填?

36 . (单选题)

③处应填?

37 . (单选题)

④处应填?

38 . (单选题)

⑤处应填?

上一题:阅读程序3
下一题:完善程序(2)