結果
| 問題 |
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;
}