結果
問題 |
No.1812 Uribo Road
|
ユーザー |
|
提出日時 | 2025-08-25 10:48:42 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 1,200 ms / 5,000 ms |
コード長 | 3,545 bytes |
コンパイル時間 | 5,705 ms |
コンパイル使用メモリ | 89,796 KB |
実行使用メモリ | 64,648 KB |
最終ジャッジ日時 | 2025-08-25 10:49:09 |
合計ジャッジ時間 | 25,394 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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); } } }