NC15479. 最短路
描述
企鹅国中有座城市,编号从到。
对于任意的两座城市和,企鹅们可以花费的时间从城市走到城市,这里为一个给定的常数。
当然除此之外还有条单向的快捷通道,第i条快捷通道从第个城市通向第个城市,走这条通道需要消耗的时间。
现在来自Penguin Kingdom University的企鹅豆豆正在考虑从城市前往城市最少需要多少时间?
输入描述
输入第一行包含三个整数N,M,C,表示企鹅国城市的个数、快捷通道的个数以及题面中提到的给定的常数C。
接下来的M行,每行三个正整数Fi,Ti,Vi(1≤Fi≤N,1≤Ti≤N,1≤Vi≤100),分别表示对应通道的起点城市标号、终点城市标号和通过这条通道需要消耗的时间。
最后一行两个正整数A,B(1≤C≤100),表示企鹅豆豆选择的起点城市标号和终点城市标号。
输出描述
输出一行一个整数,表示从城市 A 前往城市 B 需要的最少时间。
示例1
输入:
4 2 1 1 3 1 2 4 4 1 4
输出:
5
说明:
直接从 1 走到 4 就好了。示例2
输入:
7 2 10 1 3 1 2 4 4 3 6
输出:
34
说明:
先从 3 走到 2 ,再从 2 通过通道到达 4 ,再从 4 走到 6。C++(clang++ 11.0.1) 解法, 执行用时: 312ms, 内存消耗: 51468K, 提交时间: 2023-03-19 18:01:47
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); int N, M, C; cin >> N >> M >> C; vector<vector<pair<int, int>>> G(1<<17); while (M--) { int F, T, V; cin >> F >> T >> V; G[F].push_back({T, V}); } for (int i = 1; i < 1<<17; i++) { for (int j = 1; j < 1<<17; j<<=1) { G[i].push_back({i^j, j*C}); } } int A, B; cin >> A >> B; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q; vector<int> D(1<<17, 0x3f3f3f3f); D[A] = 0; Q.push({0, A}); while (!Q.empty()) { auto [d, s] = Q.top(); Q.pop(); if (D[s] != d) continue; if (s == B) break; for (auto &[t, v]: G[s]) { int tmp = D[s] + v; if (tmp >= D[t]) continue; D[t] = tmp; Q.push({D[t], t}); } } cout << D[B] << endl; }