結果
| 問題 |
No.1814 Uribo Road (Easy)
|
| ユーザー |
tnakao0123
|
| 提出日時 | 2022-01-16 02:42:27 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 9 ms / 2,000 ms |
| コード長 | 2,708 bytes |
| コンパイル時間 | 976 ms |
| コンパイル使用メモリ | 65,380 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-22 11:51:26 |
| 合計ジャッジ時間 | 2,803 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 44 |
ソースコード
/* -*- coding: utf-8 -*-
*
* 1814.cc: No.1814 Uribo Road (Easy) - yukicoder
*/
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
/* constant */
const int MAX_N = 200;
const int MAX_M = MAX_N * (MAX_N - 1) / 2;
const int MAX_K = 5;
const int KBITS = 1 << MAX_K;
const int MAX_GN = MAX_K * 2 + 2;
const long long LINF = 1LL << 62;
/* typedef */
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,int> pli;
typedef vector<pii> vpii;
/* global variables */
int rs[MAX_K], ers[MAX_M];
pii rvs[MAX_K];
vpii nbrs[MAX_N];
int cs[MAX_M], vs[MAX_GN], gbs[MAX_GN][MAX_GN];
ll ds[MAX_N], gcs[MAX_GN][MAX_GN], gds[MAX_GN * KBITS];
/* subroutines */
/* main */
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
int kbits = 1 << k, kmsk = kbits - 1;
fill(ers, ers + m, -1);
for (int i = 0; i < k; i++) {
scanf("%d", rs + i), rs[i]--;
ers[rs[i]] = i;
}
int gn = 0;
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d%d", &u, &v, cs + i);
u--, v--;
nbrs[u].push_back(pii(v, i));
nbrs[v].push_back(pii(u, i));
if (ers[i] >= 0) {
vs[gn++] = u, vs[gn++] = v;
rvs[ers[i]] = pii(u, v);
}
}
vs[gn++] = 0, vs[gn++] = n - 1;
sort(vs, vs + gn);
gn = unique(vs, vs + gn) - vs;
for (int i = 0; i < gn; i++) {
fill(ds, ds + n, LINF);
ds[vs[i]] = 0;
priority_queue<pli> q;
q.push(pli(0, vs[i]));
while (! q.empty()) {
pli u = q.top(); q.pop();
ll ud = -u.first;
int ui = u.second;
if (ds[ui] != ud) continue;
for (auto ve: nbrs[ui]) {
int vi = ve.first, ei = ve.second;
ll vd = ud + cs[ei];
if (ds[vi] > vd) {
ds[vi] = vd;
q.push(pli(-vd, vi));
}
}
}
for (int j = 0; j < gn; j++) gcs[i][j] = ds[vs[j]];
}
for (int i = 0; i < k; i++) {
int u = rvs[i].first, v = rvs[i].second;
int gu = lower_bound(vs, vs + gn, u) - vs;
int gv = lower_bound(vs, vs + gn, v) - vs;
gbs[gu][gv] = gbs[gv][gu] = 1 << i;
if (gcs[gu][gv] < cs[rs[i]])
gcs[gu][gv] = gcs[gv][gu] = cs[rs[i]];
}
int st = 0, gl = (gn - 1) << k | kmsk;
fill(gds, gds + gn * kbits, LINF);
gds[st] = 0;
priority_queue<pli> gq;
gq.push(pli(0, st));
while (! gq.empty()) {
pli u = gq.top(); gq.pop();
ll ud = -u.first;
int up = u.second;
if (gds[up] != ud) continue;
if (up == gl) break;
int ui = up >> k, ub = up & kmsk;
for (int vi = 0; vi < gn; vi++) {
ll vd = ud + gcs[ui][vi];
int vb = ub | gbs[ui][vi];
int vp = vi << k | vb;
if (gds[vp] > vd) {
gds[vp] = vd;
gq.push(pli(-vd, vp));
}
}
}
printf("%lld\n", gds[gl]);
return 0;
}
tnakao0123