列表

详情


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;
}

上一题