幅優先探索(BFS: Bredth First Search) - ysknsid25/atcoder GitHub Wiki
頂点に近いところから順番に進んでいく戦略。以下のイメージ。
一つ下の段を見切ったら、次の段を見切る。
同じく、あとは例題と実装を見るのが早い。
例題: ABC204 C
つまり出発地点を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はキューによって次の行き先を探していく。