トポロジカルソート: 作業の順番を決めよう
トポロジカルソートは、「Aをする前にBが必要」のような依存関係がある作業を、正しい順番に並べる方法です。
たとえば、料理で「野菜を切る」「鍋に入れる」「火をつける」の順番を守るようなイメージです。
使いどころ
- 作業の依存関係を整理する
- 授業やタスクの順番を決める
- 有向グラフで、先に終わらせるべきものを探す
手順
- 各頂点に入ってくる矢印の数を数える
- 入ってくる矢印が0の頂点から処理する
- その頂点から出る矢印を消す
- 新しく矢印が0になった頂点を処理する
図で見る
コピペ用コード
from collections import deque
def topological_sort(graph):
indegree = [0] * len(graph)
for edges in graph:
for to in edges:
indegree[to] += 1
queue = deque([i for i, deg in enumerate(indegree) if deg == 0])
order = []
while queue:
node = queue.popleft()
order.append(node)
for next_node in graph[node]:
indegree[next_node] -= 1
if indegree[next_node] == 0:
queue.append(next_node)
return order
graph = [[1, 3], [2], [4], [2], []]
print(topological_sort(graph))
コードの読み方
indegreeは、その頂点に入ってくる矢印の数です。indegreeが0なら、先に必要な作業がもうありません。- 処理した頂点から出る矢印を消すことで、次にできる作業を探します。
注意点
輪っかの依存関係があると、正しい順番を作れません。たとえば「Aの前にB、Bの前にA」は矛盾しています。