Python/알고리즘

[알고리즘] 위상정렬

AI 꿈나무 2021. 4. 17. 15:51
반응형

위상 정렬

  • 순환이 없는 유향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는것

알고리즘 동작 원리

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=' ')

 

관련 문제

www.acmicpc.net/problem/2252

 

2252번: 줄 세우기

첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이

www.acmicpc.net

 

출처

https://sexy-developer.tistory.com/56

https://www.youtube.com/watch?v=xeSz3pROPS8&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=36

반응형