結果
問題 | No.416 旅行会社 |
ユーザー | hiromi_ayase |
提出日時 | 2016-08-26 23:58:15 |
言語 | Java21 (openjdk 21) |
結果 |
RE
|
実行時間 | - |
コード長 | 5,337 bytes |
コンパイル時間 | 3,409 ms |
コンパイル使用メモリ | 80,684 KB |
実行使用メモリ | 293,640 KB |
最終ジャッジ日時 | 2024-11-08 16:41:08 |
合計ジャッジ時間 | 13,543 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | RE | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | TLE | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
ソースコード
import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.NoSuchElementException; import java.util.Set; public class Main { private static final int C = 10000; public static void main(String[] args) { FastScanner sc = new FastScanner(); int N = sc.nextInt(); int M = sc.nextInt(); int Q = sc.nextInt(); UnionFind uf = new UnionFind(N); Set<Integer> set = new HashSet<>(); for (int i = 0; i < M; i++) { int a = sc.nextInt() - 1; int b = sc.nextInt() - 1; set.add(a * C + b); } List<Integer> q = new ArrayList<>(); for (int i = 0; i < Q; i++) { int a = sc.nextInt() - 1; int b = sc.nextInt() - 1; set.remove(a * C + b); q.add(a * C + b); } int[] ans = new int[N]; List<List<Integer>> v = new ArrayList<>(); for (int i = 0; i < N; i++) { v.add(new ArrayList<Integer>()); } for (int x : set) { int a = x / C; int b = x % C; uf.union(a, b); } for (int i = 0; i < N; i++) { int root = uf.find(i); if (uf.find(i) == uf.find(0)) { ans[i] = -1; } v.get(root).add(i); } Collections.reverse(q); int count = 0; for (int x : q) { int a = x / C; int b = x % C; int rootA = uf.find(a); int rootB = uf.find(b); if (rootA != rootB) { List<Integer> tmp = new ArrayList<>(); int root0 = uf.find(0); if (root0 == rootA) { int root = rootB; for (int y : v.get(root)) { ans[y] = Q - count; } tmp.addAll(v.get(root)); } else if (root0 == rootB) { int root = rootA; for (int y : v.get(root)) { ans[y] = Q - count; } tmp.addAll(v.get(root)); } else { tmp = new ArrayList<>(); tmp.addAll(v.get(rootA)); tmp.addAll(v.get(rootB)); } uf.union(a, b); rootA = uf.find(a); for (int y : tmp) { v.get(rootA).add(y); } } count++; } StringBuilder sb = new StringBuilder(); for (int i = 1; i < N; i++) { sb.append(ans[i]); sb.append("\n"); } System.out.println(sb); } } class UnionFind { private int[] table; private int[] rank; public UnionFind(int size) { this.table = new int[size]; this.rank = new int[size]; for (int i = 0; i < size; i++) { this.table[i] = i; this.rank[i] = 1; } } public boolean isSame(int node1, int node2) { return find(node1) == find(node2); } public int find(int node) { if (table[node] == node) { return node; } else { return table[node] = find(table[node]); } } public void union(int node1, int node2) { int root1 = find(node1); int root2 = find(node2); if (rank[root1] < rank[root2]) { table[root1] = root2; } else if (rank[root1] > rank[root2]) { table[root2] = root1; } else if (root1 != root2) { table[root2] = root1; rank[root1]++; } } } class FastScanner { public static String debug = null; private final InputStream in = System.in; private int ptr = 0; private int buflen = 0; private byte[] buffer = new byte[1024]; private boolean eos = false; private boolean hasNextByte() { if (ptr < buflen) { return true; } else { ptr = 0; try { if (debug != null) { buflen = debug.length(); buffer = debug.getBytes(); debug = ""; eos = true; } else { buflen = in.read(buffer); } } catch (IOException e) { e.printStackTrace(); } if (buflen < 0) { eos = true; return false; } else if (buflen == 0) { return false; } } return true; } private int readByte() { if (hasNextByte()) return buffer[ptr++]; else return -1; } private static boolean isPrintableChar(int c) { return 33 <= c && c <= 126; } private void skipUnprintable() { while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++; } public boolean isEOS() { return this.eos; } public boolean hasNext() { skipUnprintable(); return hasNextByte(); } public String next() { if (!hasNext()) throw new NoSuchElementException(); StringBuilder sb = new StringBuilder(); int b = readByte(); while (isPrintableChar(b)) { sb.appendCodePoint(b); b = readByte(); } return sb.toString(); } public long nextLong() { if (!hasNext()) throw new NoSuchElementException(); long n = 0; boolean minus = false; int b = readByte(); if (b == '-') { minus = true; b = readByte(); } if (b < '0' || '9' < b) { throw new NumberFormatException(); } while (true) { if ('0' <= b && b <= '9') { n *= 10; n += b - '0'; } else if (b == -1 || !isPrintableChar(b)) { return minus ? -n : n; } else { throw new NumberFormatException(); } b = readByte(); } } public int nextInt() { return (int) nextLong(); } public long[] nextLongList(int n) { return nextLongTable(1, n)[0]; } public int[] nextIntList(int n) { return nextIntTable(1, n)[0]; } public long[][] nextLongTable(int n, int m) { long[][] ret = new long[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { ret[i][j] = nextLong(); } } return ret; } public int[][] nextIntTable(int n, int m) { int[][] ret = new int[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { ret[i][j] = nextInt(); } } return ret; } }