Directed Acyclic Graph (DAG)
정점들을 위상에 맞춰 정렬
InDegree가 없는 정점 먼저
사이클이 존재한다면 정렬 할 수 없음
Q. “제일 먼저” 올 수 있는 정점은 ?
A. “들어오는 간선”이 없는 정점!
모든 정점의 InDegree를 계산 먼저 해줌
그후 정점을 찾아서 자료구조 D에 넣고
D가 빌때까지 InDegree 가 0인것을 D에 추가하고 제거하는 것을 반복
자료구조 D가 하는 일
→ 이걸 빠르게 해주는 것은 ?? Queue,Stack,Linked List (넣고 빼는건 O(1) )
while queue:
x = queue.pop()
for y in adj[x] :
indeg[y] -= 1
if indeg[y] == 0 :
queue.append(y)
시간 복잡도를 낮게 하기 위해 D가 빌때까지 X를 꺼내서 정렬시키고 제거하는 것을
새롭게 정렬 가능한 점을 찾아서 D에 넣는다. (모든 간선을 다 탐색할 때 보다 훨씬 빨라짐)
→ O(|E|)