結果
問題 | No.1812 Uribo Road |
ユーザー |
|
提出日時 | 2022-01-14 22:42:07 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,165 bytes |
コンパイル時間 | 2,818 ms |
コンパイル使用メモリ | 209,656 KB |
最終ジャッジ日時 | 2025-01-27 11:57:38 |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 22 TLE * 8 |
ソースコード
#include <bits/stdc++.h> using namespace std; struct edge{ int to; int cost; int i; }; typedef tuple<int, int, int> P; int main(){ int N, M, K; cin >> N >> M >> K; vector<int> R(K); for(int i = 0; i < K; i++) { cin >> R[i]; R[i]--; } vector<vector<edge>> G(N); vector<int> t(M, -1); for(int i = 0; i < K; i++) t[R[i]] = i; for(int i = 0; i < M; i++){ int A, B, C; cin >> A >> B >> C; A--; B--; G[A].push_back({B, C, i}); G[B].push_back({A, C, i}); } int INF = 1000000000; vector<vector<int>> d(N, vector<int>(1 << K, INF)); d[0][0] = 0; priority_queue<P, vector<P>, greater<P>> q; q.push({0, 0, 0}); while(!q.empty()){ auto [dis, now, bit] = q.top(); q.pop(); if(d[now][bit] > dis) continue; for(auto [to, cost, i] : G[now]){ int b = bit; if(t[i] != -1) b |= (1 << t[i]); if(d[to][b] > dis + cost){ d[to][b] = dis + cost; q.push({d[to][b], to, b}); } } } cout << d[N - 1][(1 << K) - 1] << endl; }