結果

問題 No.1812 Uribo Road
ユーザー Nikita SkybytskyiNikita Skybytskyi
提出日時 2022-01-14 22:55:43
言語 C++17(clang)
(17.0.6 + boost 1.83.0)
結果
AC  
実行時間 115 ms / 5,000 ms
コード長 2,532 bytes
コンパイル時間 4,619 ms
コンパイル使用メモリ 173,824 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-11-20 13:30:42
合計ジャッジ時間 6,510 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,820 KB
testcase_02 AC 1 ms
6,820 KB
testcase_03 AC 11 ms
6,816 KB
testcase_04 AC 2 ms
6,816 KB
testcase_05 AC 2 ms
6,820 KB
testcase_06 AC 2 ms
6,816 KB
testcase_07 AC 2 ms
6,820 KB
testcase_08 AC 3 ms
6,816 KB
testcase_09 AC 4 ms
6,820 KB
testcase_10 AC 3 ms
6,816 KB
testcase_11 AC 2 ms
6,816 KB
testcase_12 AC 60 ms
6,816 KB
testcase_13 AC 38 ms
6,820 KB
testcase_14 AC 33 ms
6,816 KB
testcase_15 AC 31 ms
6,816 KB
testcase_16 AC 28 ms
6,816 KB
testcase_17 AC 85 ms
6,820 KB
testcase_18 AC 37 ms
6,816 KB
testcase_19 AC 114 ms
6,816 KB
testcase_20 AC 115 ms
6,816 KB
testcase_21 AC 95 ms
6,816 KB
testcase_22 AC 82 ms
6,820 KB
testcase_23 AC 7 ms
6,816 KB
testcase_24 AC 2 ms
6,820 KB
testcase_25 AC 14 ms
6,820 KB
testcase_26 AC 3 ms
6,816 KB
testcase_27 AC 22 ms
6,820 KB
testcase_28 AC 24 ms
6,816 KB
testcase_29 AC 2 ms
6,816 KB
testcase_30 AC 4 ms
6,820 KB
testcase_31 AC 72 ms
6,820 KB
testcase_32 AC 3 ms
6,816 KB
testcase_33 AC 30 ms
6,816 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

/*
 * Author: nskybytskyi
 * Time:   2022-01-13 15:08:45
 */

#include <bits/stdc++.h>
using namespace std;

const int64_t inf = numeric_limits<int64_t>::max();

int main() {
  cin.tie(0)->sync_with_stdio(0);

  int n, m, k;
  cin >> n >> m >> k;

  vector<int> r(k);
  for (auto& ri : r) {
    cin >> ri;
    --ri;
  }

  vector<tuple<int, int, int>> abc(m);
  for (auto& [a, b, c] : abc) {
    cin >> a >> b >> c;
    --a, --b;
  }

  vector<vector<pair<int, int>>> g(n);
  for (auto [a, b, c] : abc) {
    g[a].emplace_back(b, c);
    g[b].emplace_back(a, c);
  }

  set<int> special_set;
  special_set.insert(0);
  special_set.insert(n - 1);
  for (auto ri : r) {
    auto [a, b, _] = abc[ri];
    special_set.insert(a);
    special_set.insert(b);
  }

  vector<int> special(special_set.begin(), special_set.end());
  const int len = special.size();

  map<int, int> index;
  for (int i = 0; i < len; ++i) {
    index[special[i]] = i;
  }

  auto dijkstra = [&] (int s) -> vector<int64_t> {
    vector<int64_t> dist(n, inf);
    dist[s] = 0;
    priority_queue<pair<int64_t, int>,
                   vector<pair<int64_t, int>>,
                   greater<>> pq;

    pq.emplace(0, s);
    while (!pq.empty()) {
      auto [dv, v] = pq.top();
      pq.pop();
      if (dv == dist[v]) {
        for (auto [u, w] : g[v]) {
          if (dist[u] > dist[v] + w) {
            dist[u] = dist[v] + w;
            pq.emplace(dist[u], u);
          }
        }
      }
    }

    vector<int64_t> ans;
    for (auto f : special) {
      ans.push_back(dist[f]);
    }
    return ans;
  };


  vector<vector<int64_t>> dist;
  for (auto s : special) {
    dist.push_back(dijkstra(s));
  }

  vector<vector<int64_t>> dp(1 << k, vector<int64_t>(len, inf));
  dp[0][0] = 0;
  for (int mask = 0; mask < (1 << k); ++mask) {
    for (int curr = 0; curr < len; ++curr) {
      if (dp[mask][curr] < inf) {
        for (int next = 0; next < len; ++next) {
          dp[mask][next] = min(dp[mask][next], dp[mask][curr] + dist[curr][next]);
        }
      }
    }
    for (int curr = 0; curr < len; ++curr) {
      for (int i = 0; i < k; ++i) {
        auto [_a, _b, c] = abc[r[i]];
        auto a = index[_a], b = index[_b];
        if (dp[mask][a] < inf) {
          dp[mask | (1 << i)][b] = min(dp[mask | (1 << i)][b], dp[mask][a] + c);
        }
        if (dp[mask][b] < inf) {
          dp[mask | (1 << i)][a] = min(dp[mask | (1 << i)][a], dp[mask][b] + c);
        }
      }
    }
  }

  cout << dp[(1 << k) - 1].back() << "\n";

  return 0;
}
0