AtCoder Regular Contest 037 B – バウムテスト をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Regular Contest 037 B – バウムテスト

グラフが木……ってそっちかーい。問題自体は難しくないが、木の定義・基礎的な性質を知っておく必要はある。

# AtCoder Regular Contest 037 B - バウムテスト
# https://atcoder.jp/contests/arc037/tasks/arc037_b
# tag: グラフ 木 閉路 BFS DFS 高橋君 典型問題

# 閉路検出の典型問題。
# BFS、もしくは DFS で各連結成分の探索を行い、
# 途中で訪問済みの頂点が現れた場合は
# 閉路が存在する = 木では無い。
# 逆に閉路が存在しなければ、木となる。

def main():
N, M = map(int, input().split())
path_dat = [list(map(int, input().split())) for _ in range(M)]

paths = [[] for _ in range(N)]

for u, v in path_dat:
paths[u-1].append(v-1)
paths[v-1].append(u-1)

result = 0

visited = [False] * N

# 各頂点をスタートとして、連結成分を全てチェックしていく
for start in range(N):
# 訪問済みならスキップ
if visited[start]:
continue

# 木かどうかのチェック用
is_tree = True

visited[start] = True
queue = [(-1, start)]
while queue:
prev, now = queue.pop()
for nxt in paths[now]:
# 一つ前に戻る経路はスキップする。
if nxt == prev:
continue
# 訪問済みの頂点が現れたら、木では無い。
if visited[nxt]:
is_tree = False
continue
visited[nxt] = True
queue.append((now, nxt))

# 木なら回答に +1
result += is_tree

print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です