結果
| 問題 |
No.1812 Uribo Road
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-12 18:05:15 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 1,009 ms / 5,000 ms |
| コード長 | 3,545 bytes |
| コンパイル時間 | 4,559 ms |
| コンパイル使用メモリ | 84,716 KB |
| 実行使用メモリ | 63,520 KB |
| 最終ジャッジ日時 | 2025-08-12 18:05:37 |
| 合計ジャッジ時間 | 21,326 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 30 |
ソースコード
import java.util.*;
public class Solution {
static final long INF = (long)1e18;
static Scanner scanner = new Scanner(System.in);
static class Edge {
int c;
int u;
Edge(long c, int u) {
this.c = (int)c;
this.u = u;
}
}
public static void main(String[] args) {
while (scanner.hasNext()) {
int N = scanner.nextInt();
int M = scanner.nextInt();
int K = scanner.nextInt();
int[] R = new int[K];
for (int k = 0; k < K; k++) {
R[k] = scanner.nextInt() - 1;
}
int[] A = new int[M];
int[] B = new int[M];
long[] C = new long[M];
for (int i = 0; i < M; i++) {
A[i] = scanner.nextInt() - 1;
B[i] = scanner.nextInt() - 1;
C[i] = scanner.nextLong();
}
List<Integer>[] G = new List[N];
for (int i = 0; i < N; i++) {
G[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
G[A[i]].add(i);
G[B[i]].add(i);
}
int[] ss = new int[2 * K + 2];
for (int k = 0; k < K; k++) {
ss[2 * k + 0] = A[R[k]];
ss[2 * k + 1] = B[R[k]];
}
ss[2 * K + 0] = 0;
ss[2 * K + 1] = N - 1;
long[][] dist = new long[2 * K + 2][N];
for (int x = 0; x < 2 * K + 2; x++) {
PriorityQueue<Edge> que = new PriorityQueue<>((a, b) -> Long.compare(a.c, b.c));
Arrays.fill(dist[x], INF);
dist[x][ss[x]] = 0;
que.offer(new Edge(0, ss[x]));
while (!que.isEmpty()) {
Edge cur = que.poll();
long c = cur.c;
int u = cur.u;
if (dist[x][u] == c) {
for (int i : G[u]) {
long cc = c + C[i];
int v = A[i] ^ B[i] ^ u;
if (cc < dist[x][v]) {
dist[x][v] = cc;
que.offer(new Edge(cc, v));
}
}
}
}
}
long[][] dp = new long[1 << K][2 * K + 2];
for (int p = 0; p < 1 << K; p++) {
Arrays.fill(dp[p], INF);
}
dp[0][2 * K + 0] = 0;
for (int p = 0; p < 1 << K; p++) {
for (int x = 0; x < 2 * K + 2; x++) {
for (int k = 0; k < K; k++) {
if ((p & (1 << k)) == 0) {
dp[p | 1 << k][2 * k + 1] = Math.min(dp[p | 1 << k][2 * k + 1],
dp[p][x] + dist[x][A[R[k]]] + C[R[k]]);
dp[p | 1 << k][2 * k + 0] = Math.min(dp[p | 1 << k][2 * k + 0],
dp[p][x] + dist[x][B[R[k]]] + C[R[k]]);
}
}
}
}
long ans = INF;
for (int x = 0; x < 2 * K + 2; x++) {
ans = Math.min(ans, dp[(1 << K) - 1][x] + dist[x][N - 1]);
}
System.out.println(ans);
}
}
}