위상정렬은 순서가 정해져 있는 일련의 작업을 차례대로 수행해야 할 때 사용하는 알고리즘이다.
자료구조 -> 알고리즘 -> 고급 알고리즘 (O)
자료구조 -> 고급 알고리즘 -> 알고리즘 (X)
위상정렬은 사이클이 없는 방향 그래프(DAG)에만 적용이 가능하다.
1 -> 2 -> 5 -> 3 -> 4 -> 6 -> 7 (O)
1 -> 5 -> 2 -> 3 -> 4 -> 6 -> 7 (O)
⏩ 진입 차수가 0인 정점을 찾아 큐에 삽입
⏩ 큐에서 원소를 꺼내 연결된 간선을 제거
⏩ 간선 제거 후 진입차수가 0이된 새로운 정점을 큐에 삽입
⏩ 큐가 빌 때까지 위 과정을 반복
from collections import deque
input = sys.stdin.readline
v, e = map(int, input().split()) # 노드 수, 간선 수
indegree = [0] * (v + 1) # 모든 노드에 대한 진입차수는 0으로 초기화
graph = [[] for _ in range(v + 1)] # 각 노드에 연결된 간선정보 (인접 행렬)
for _ in range(e):
a, b = map(int, input().split())
graph[a].append(b) # 인접행렬 업데이트
indegree[b] += 1 # 진입차수 업데이트
# 위상 정렬 함수
def Topology_sort():
result = []
Q = deque()
for i in range(1, v + 1): # 진입차수 0인 정점 찾기
if indegree[i] == 0:
Q.append(i)
while Q:
now = Q.popleft()
result.append(now)
for g in graph[now]: # now 정점에서 갈 수 있는 정점 g
indegree[g] -= 1 # 진입차수 -1 (간선 제거)
if indegree[g] == 0: # 진입차수가 0인 새로운 정점 삽입
Q.append(g)
# 위상 정렬 수행한 결과 출력
for res in result:
print(res, end=' ')
topology_sort()