반응형
위상 정렬
- 순환이 없는 유향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는것
알고리즘 동작 원리
1. 진입 차수가 0인 노드를 queue에 삽입.
2. 큐에서 노드를 하나씩 꺼내면서 아래의 과정을 진행
- 꺼낸 노드의 간선을 그래프에서 제거
- 진입 차수가 0인 새로운 노드를 queue에 삽입
파이썬 코드
from collections import deque
# 노드의 개수와 간선의 개수를 입력 받기
v, e = map(int, input().split())
# 진입차수 0으로 초기화
in_degree = [0] * (v+1)
# 빈 인접리스트 그래프 생성
graph = [[] for i in range(v+1)]
# 방향 그래프의 간선 정보 입력 받기
for i in range(e):
a, b = map(int, input().split())
graph[a].append(b)
# 진입차수 갱신
in_degree[b] += 1
# 위상정렬 함수
def topology_sort():
result = []
q = deque()
# 진입차수가 0인 노드 큐에 삽입
for i in range(1, v+1):
if in_degree[i] == 0:
q.append(i)
# 큐가 빌때까지 실행
while q:
# 진입차수 0인 노드 q에서 꺼내기
node = q.popleft()
result.append(node)
# 꺼낸 노드의 간선 제거
for i in graph[node]:
in_degree[i] -= 1
# 진입차수가 0인 새로운 노드 q에 삽입
if in_degree[i] == 1:
q.append(i)
# 결과 출력
for i in result:
print(i, end=' ')
관련 문제
출처
https://sexy-developer.tistory.com/56
https://www.youtube.com/watch?v=xeSz3pROPS8&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=36
반응형
'Python > 알고리즘' 카테고리의 다른 글
[알고리즘] 이분 그래프(bipartite graph) 판별하기 (0) | 2021.04.19 |
---|---|
[알고리즘] SCC 찾기 - 코사라주 알고리즘(kosaraju's algorithm) (0) | 2021.04.18 |
[파이썬 알고리즘 인터뷰] 39. 코스 스케줄 (0) | 2021.03.18 |
[파이썬 알고리즘 인터뷰] 35. 조합 (0) | 2021.03.16 |
[파이썬 알고리즘 인터뷰] 38. 일정 재구성 (0) | 2021.03.13 |