幅優先探索(BFS: Bredth First Search) - ysknsid25/atcoder GitHub Wiki

頂点に近いところから順番に進んでいく戦略。以下のイメージ。

image

一つ下の段を見切ったら、次の段を見切る。

image

同じく、あとは例題と実装を見るのが早い。

例題: ABC204 C

C - Tour

つまり出発地点を1~Nの都市として、その都市から行ける都市をまずは見ていく。行った都市には印をつける。まだ行ってない都市が見つからなくなったら出発地点を次にする。要はスタートを固定して、幅優先探索して行き着いた都市をゴールとして数を数えれば答えになる。

以下のように実装した。

from collections import deque

n, m = map(int, input().split())
con = [[] for i in range(n+1)]
for i in range(m):
  a, b = map(int, input().split())
  con[a].append(b)

def bfs(start, n, con):
  count = 1
  visited = [False for i in range(n+1)]
  visited[start] = True
  visit = deque()
  visit.append(start)
  while 0 < len(visit):
    city = visit.popleft()
    for tocity in con[city]:
      if not visited[tocity]:
        visited[tocity] = True
        count += 1
        visit.append(tocity)
  return count

ans = 0
for i in range(1, n+1):
  ans += bfs(i, n, con)

print(ans)

BFSはキューによって次の行き先を探していく。