import qualified Data.Set as Set
import qualified Data.Map.Strict as Map

getTSortedSCCs :: Ord node => Map.Map node (Set.Set node) → [Set.Set node]
getTSortedSCCs digraph = snd (spanningSearch getIns (Set.empty, []) (snd (depthFirstSearch getOuts (Set.empty, []) getVertices))) where
___ depthFirst rel (visted, sorted) cur
___ ___ | cur `Set.member` visited = (visited, sorted)
___ ___ | otherwise = case depthFirstSearch rel (Set.inset cur visited, sorted) (rel cur) of
___ ___ ___ (visited', sorted') → (visited', cur : sorted')
___ spanning rel (visted, sccs) cur
___ ___ | cur `Set.member` visited = (visited, sccs)
___ ___ | otherwise = case depthFirstSearch rel (Set.insert cur visited, []) (rel cur) of
___ ___ ___ (visited', sorted') → (visited', Set.fromList (cur : sorted') : sccs)
___ getVertices = map fst (Map.toList digraph)
___ getIns node = [ node' | (node', nodes) ← Map.toList digraph, node `Set.member` nodes ]
___ getOuts node = Set.toList (fromJust (Map.lookup node digraph))
___ depthFirstSearch = foldl . depthFirst
___ spanningSearch = foldl . spanning

유향그래프를 넣으면 SCC들의 위상정렬된 리스트가 나오는 이유 좀 설명해주셈 ㅇㅅㅇ

- dc official App