給定多張聯程機票 (每張包含多個城市序列及價格) 及若干行程,求完成行程的最小費用。城市編號較大需哈希映射。
(i, city):表示已完成行程前 i 個城市,當前位於 city。(0, start_city),終點:(k, end_city) (k 為行程城市數)。標準堆優化 Dijkstra,節點數 ≤ 行程長度 × 不同城市數,邊數 ≤ 機票數 × 機票城市數 × 行程長度。使用 map 將城市編號壓縮為 0-based 索引。
struct Edge { int u, v, cost, id; };
struct HeapNode { int d, u; bool operator<(HeapNode o) const { return d > o.d; } };
struct Dijkstra {
// ... 標準實現:init, add_edge, dijkstra ...
void dijkstra(int s) {
priority_queue pq;
fill(d, d+n, INF); d[s] = 0;
pq.push({0, s});
while (!pq.empty()) {
auto [du, u] = pq.top(); pq.pop();
if (du != d[u]) continue;
for (int i = head[u]; ~i; i = nxt[i]) {
int v = edges[i].v, w = edges[i].cost;
if (d[v] > du + w) {
d[v] = du + w;
p[v] = i;
pq.push({d[v], v});
}
}
}
}
};
unordered_map 或 map)。p[] 回溯。