• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

dfs-トポロジカルソート

date: 2022-07-30 excerpt: dfs-トポロジカルソートについて

tag: algorithmdfsdepth-first searchトポロジカルソート


dfs-トポロジカルソートについて

概要

  • グラフの向きを左から右へのDAGを成立させた状態で、左のedgeを取り除いても、グラフとして破綻しないようにしたもの
  • ユースケース
    • タスクのスケジューリング問題
    • コンパイル時の依存などのリンク順序の解決
  • dfsを利用してトポロジカルソートを行うことができ、post-order(帰りがけの順)をノードを記録することでトポロジカルソートの結果を得ることができる

具体例

from typing import List
from collections import defaultdict
from collections import deque
def topological_sort(prerequisites: List[List[int]]):
    G = defaultdict(list)
    for to, frm in prerequisites:
        G[frm].append(to)
    que = deque()
    vis = defaultdict(lambda :0)

    for key_pos in list(G.keys()):
        dfs(G, key_pos, que, vis)
    return list(que)

def dfs(G, pos, que, vis):
    if vis[pos] == 1:
        return
    for npos in G[pos]:
        dfs(G, npos, que, vis)
    que.appendleft(pos)
    vis[pos] = 1

参考

  • トポロジカルソート/Wikipedia
  • トポロジカルソートのアルゴリズム(閉路のない有向グラフDAGのソート)


algorithmdfsdepth-first searchトポロジカルソート Share Tweet