結果
| 問題 |
No.977 アリス仕掛けの摩天楼
|
| ユーザー |
|
| 提出日時 | 2022-11-27 15:38:43 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 256 ms / 2,000 ms |
| コード長 | 1,581 bytes |
| コンパイル時間 | 978 ms |
| コンパイル使用メモリ | 82,248 KB |
| 実行使用メモリ | 89,216 KB |
| 最終ジャッジ日時 | 2024-10-04 04:34:33 |
| 合計ジャッジ時間 | 4,931 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
# Bobに渡した時点で連結成分が2つであればBobの勝ち
# 従い、初期状態で以下のいずれかを満たせればAliceの勝ちである
# ・連結成分が1つ->Bobの勝ち
# ・連結成分が3つ以上ある->Aliceの勝ち
# ・連結成分が2つ
# ->両方とも辺が複数あれば、必ずどちらかは木なのでAliceの勝ち
# ->片方が孤立した頂点の場合、もう一方が完全な輪であれば(入り次数が全て2であれば)Bobの勝ち、そうでなければAliceの勝ち
# 言い換えると、入り次数が2の頂点がN - 1個、入り次数が0の頂点が1個だとBobの勝ち
N = int(input())
G = [[] for i in range(N)]
indegree = [0] * N
for _ in range(N - 1):
u,v = map(int,input().split())
G[u].append(v)
G[v].append(u)
indegree[u] += 1
indegree[v] += 1
# 連結成分の数を数える
visited = [False] * N
cnt = 0
for start in range(N):
if visited[start]:
continue
cnt += 1
stack = [start]
visited[start] = True
while stack:
v = stack.pop()
for child in G[v]:
if visited[child]:
continue
visited[child] = True
stack.append(child)
if cnt == 1:
print("Bob")
elif cnt >= 3:
print("Alice")
else:
ins_0 = 0
ins_2 = 0
for i in range(N):
if indegree[i] == 0:
ins_0 += 1
elif indegree[i] == 2:
ins_2 += 1
if ins_0 == 1 and ins_2 == N - 1:
print("Bob")
else:
print("Alice")