結果
問題 | No.807 umg tours |
ユーザー |
![]() |
提出日時 | 2019-07-10 02:44:16 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 1,413 ms / 4,000 ms |
コード長 | 5,551 bytes |
コンパイル時間 | 2,697 ms |
コンパイル使用メモリ | 82,384 KB |
実行使用メモリ | 75,440 KB |
最終ジャッジ日時 | 2024-11-23 19:33:27 |
合計ジャッジ時間 | 21,454 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 26 |
ソースコード
import java.io.*;import java.util.*;import java.util.function.Function;public class Main {static int N, M;static Edge[] E;public static void main(String[] args) {FastScanner sc = new FastScanner(System.in);N = sc.nextInt();M = sc.nextInt();E = new Edge[M];for (int i = 0; i < M; i++) {E[i] = new Edge(sc.nextInt()-1, sc.nextInt()-1, sc.nextInt());}writeLines(solve());}static class Edge {int a, b, c;public Edge(int a, int b, int c) {this.a = a;this.b = b;this.c = c;}}static long[] solve() {Edge[][] G = adjB(N, E);long[][] dist = new long[N][2];for (long[] row : dist) {Arrays.fill(row, Long.MAX_VALUE/2);}dist[0][0] = 0;PriorityQueue<State> q = new PriorityQueue<>(Comparator.<State>comparingLong(s -> s.d).thenComparingInt(s -> s.used));q.add(new State(0, 0, 0L));while( !q.isEmpty() ) {State s = q.poll();if( dist[s.a][s.used] != s.d ) continue;for (Edge e : G[s.a]) {int b = e.a == s.a ? e.b : e.a;if( dist[b][s.used] > dist[s.a][s.used] + e.c ) {dist[b][s.used] = dist[s.a][s.used] + e.c;q.add( new State(b, s.used, dist[b][s.used]) );}if( s.used == 0 && dist[b][1] > dist[s.a][0] ) {dist[b][1] = dist[s.a][0];q.add( new State(b, 1, dist[b][1]) );}}}long[] ans = new long[N];for (int i = 1; i < N; i++) {ans[i] = dist[i][0] + dist[i][1];}return ans;}static Edge[][] adjB(int n, Edge[] E) {Edge[][] adj = new Edge[n][];int[] cnt = new int[n];for (Edge e : E) {cnt[e.a]++;cnt[e.b]++;}for (int i = 0; i < n; i++) {adj[i] = new Edge[cnt[i]];}for (Edge e : E) {adj[e.a][--cnt[e.a]] = e;adj[e.b][--cnt[e.b]] = e;}return adj;}static class State {int a, used;long d;public State(int a, int used, long d) {this.a = a;this.used = used;this.d = d;}}@SuppressWarnings("unused")static class FastScanner {private BufferedReader reader;private StringTokenizer tokenizer;FastScanner(InputStream in) {reader = new BufferedReader(new InputStreamReader(in));tokenizer = null;}String next() {if (tokenizer == null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(reader.readLine());} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}String nextLine() {if (tokenizer == null || !tokenizer.hasMoreTokens()) {try {return reader.readLine();} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken("\n");}long nextLong() {return Long.parseLong(next());}int nextInt() {return Integer.parseInt(next());}int[] nextIntArray(int n) {int[] a = new int[n];for (int i = 0; i < n; i++)a[i] = nextInt();return a;}int[] nextIntArray(int n, int delta) {int[] a = new int[n];for (int i = 0; i < n; i++)a[i] = nextInt() + delta;return a;}long[] nextLongArray(int n) {long[] a = new long[n];for (int i = 0; i < n; i++)a[i] = nextLong();return a;}}static <A> void writeLines(A[] as, Function<A, String> f) {PrintWriter pw = new PrintWriter(System.out);for (A a : as) {pw.println(f.apply(a));}pw.flush();}static void writeLines(int[] as) {PrintWriter pw = new PrintWriter(System.out);for (int a : as) pw.println(a);pw.flush();}static void writeLines(long[] as) {PrintWriter pw = new PrintWriter(System.out);for (long a : as) pw.println(a);pw.flush();}static int max(int... as) {int max = Integer.MIN_VALUE;for (int a : as) max = Math.max(a, max);return max;}static int min(int... as) {int min = Integer.MAX_VALUE;for (int a : as) min = Math.min(a, min);return min;}static void debug(Object... args) {StringJoiner j = new StringJoiner(" ");for (Object arg : args) {if (arg instanceof int[]) j.add(Arrays.toString((int[]) arg));else if (arg instanceof long[]) j.add(Arrays.toString((long[]) arg));else if (arg instanceof double[]) j.add(Arrays.toString((double[]) arg));else if (arg instanceof Object[]) j.add(Arrays.toString((Object[]) arg));else j.add(arg.toString());}System.err.println(j.toString());}}