Skip to content
Gyunseo's Blog
Go back

Topological Sort Algorithm

Suggest Changes

Table of contents

Open Table of contents

python 코드

import sys
from typing import List, Final, Optional
from collections import deque

input = sys.stdin.readline
MAX_VERTEX_SIZE: Final[int] = 32_000
MAX_EDGE_SIZE: Final[int] = 100_000
N: Optional[int] = None
M: Optional[int] = None
in_degree: List[int] = [0 for i in range(MAX_VERTEX_SIZE + 1)]
adjacent_lists: List[List[int]] = [[] for _ in range(MAX_VERTEX_SIZE + 1)]


def small_alphabet_to_int(ch: str) -> int:
    return ord(ch) - ord("a") + 1


def int_to_small_alphabet(i: int) -> str:
    return chr(i + ord("a") - 1)


def read_console_input() -> None:
    global N, M
    N, M = map(int, sys.stdin.readline().split())
    for _ in range(M):
        u, v = input().rstrip().split()
        u_ord: int = small_alphabet_to_int(u)
        v_ord: int = small_alphabet_to_int(v)
        in_degree[v_ord] += 1
        adjacent_lists[u_ord].append(v_ord)


def solve() -> None:
    queue: deque = deque()
    if N is None:
        raise ValueError("N is None")
    for i in range(1, N + 1):
        # 위상 정렬 시작 지점을 검색하여, 큐에 넣는다
        if in_degree[i] == 0:
            queue.append(i)
    while queue:
        cv: int = queue.popleft()
        print(int_to_small_alphabet(cv), end=" ")

        for nv in adjacent_lists[cv]:
            # cv와 연결된 정점들의 진입 차수를 1 감소시킨다
            # 진입 차수가 0이 되면 큐에 넣는다
            in_degree[nv] -= 1
            if in_degree[nv] == 0:
                queue.append(nv)


if __name__ == "__main__":
    read_console_input()
    solve()
    print()

How to Run

python version: 3.11.6

Run main.py

pip install pipenv
pipenv --python 3.11.6
pipenv run python3 main.py < input.txt

Input

input.txt:

7 12
a b
a c
b e
b g
c f
d a
d b
d c
d f
d g
g e
g f

Output

d a b c g e f

Execution Image


Suggest Changes
Share this post on:

Previous Post
Binary Search Algorithm
Next Post
DFS and BFS Algorithms