結果
| 問題 |
No.977 アリス仕掛けの摩天楼
|
| ユーザー |
k_6101
|
| 提出日時 | 2020-01-31 22:16:48 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 1,101 ms / 2,000 ms |
| コード長 | 3,911 bytes |
| コンパイル時間 | 2,620 ms |
| コンパイル使用メモリ | 92,576 KB |
| 実行使用メモリ | 75,784 KB |
| 最終ジャッジ日時 | 2024-09-17 08:37:39 |
| 合計ジャッジ時間 | 14,576 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
import static java.util.Comparator.comparing;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
PrintWriter out = new PrintWriter(System.out);
Solver solver = new Solver(System.in, out);
solver.solve();
out.close();
}
}
class Solver {
Scanner sc;
PrintWriter out;
public Solver(InputStream in, PrintWriter out) {
sc = new Scanner(in);
this.out = out;
}
// ==========================================================
Map<Integer, Integer> map = new HashMap<>();
public void solve() {
int N = ni();
init(N);
int u, v;
for (int i = 0; i < N-1; i++) {
u = ni();
v = ni();
connect(u, v);
map.merge(u,1,Integer::sum);
map.merge(v,1,Integer::sum);
}
int min = 1000000;
for(int key : map.keySet()) {
min = Math.min(min, map.get(key));
}
if(groupCnt() == 1 || groupCnt() <= min)
out.println("Bob");
else out.println("Alice");
}
int[] par; // [子番号] = 親番号(親の場合、メンバ数のマイナス値)
// [1]=3 [2]=-1 [3]=-2 なら 1 と 3 は 同じグループ
// 親の番号を返す(この中で親に直接つなぎ変えている)
int root(int x) {
if(par[x] < 0) return x; // 親の場合はマイナスが入っている
else return par[x] = root(par[x]);
}
// 同じグループなら true を返す
boolean same(int x, int y) {
return root(x) == root(y);
}
// グループ数を返す
int groupCnt() {
int ans = 0;
for(int i = 0; i < par.length; i++) {
if(par[i] < 0) ans++;
}
return ans;
}
// メンバ数を返す
int size(int x) {
return -par[root(x)];
}
// 同じ親につなげる
void connect(int x, int y) {
x = root(x); // 親を取得する
y = root(y); // 親を取得する
if(x == y) return; // 同じなので処理しない
if(size(x) > size(y)) { // メンバ数が多い方にくっつける
par[x] += par[y]; // メンバ数を更新する
par[y] = x; // 親番号を設定する
} else {
par[y] += par[x];
par[x] = y;
}
}
// 初期化
void init(int n) {
par = new int[n];
Arrays.fill(par, -1); // 全部が親で、メンバ数を 1 とする
}
void dump(PrintWriter out) {
for(int i = 0; i < par.length; i++) {
out.println("par[" + i + "] = " + par[i]);
}
out.println("");
}
// ------------------------------------------
// 入力
// ------------------------------------------
public int ni() {
return sc.nextInt();
}
public long nl() {
return sc.nextLong();
}
public String ns() {
return sc.next();
}
public char[] nc() {
return sc.next().toCharArray();
}
public int[] ndi(int N) {
int[] ans = new int[N];
for (int i = 0; i < N; i++) {
ans[i] = ni();
}
return ans;
}
public long[] ndl(int N) {
long[] ans = new long[N];
for (int i = 0; i < N; i++) {
ans[i] = nl();
}
return ans;
}
public String[] nds(int N) {
String[] ans = new String[N];
for (int i = 0; i < N; i++) {
ans[i] = ns();
}
return ans;
}
public char[][] ndc(int N) {
char[][] ans = new char[N][];
for (int i = 0; i < N; i++) {
ans[i] = nc();
}
return ans;
}
public int[][] nddi(int N, int S) {
int[][] ans = new int[N][S];
for (int i = 0; i < N; i++) {
for (int j = 0; j < S; j++) {
ans[i][j] = ni();
}
}
return ans;
}
}
k_6101