Computer Science/Algorithms

🎒 Topology Sort

metamong 2024. 10. 11.

intro

🎒 μœ„μƒ μ •λ ¬ = 사이클이 μ—†λŠ” λ°©ν–₯ κ·Έλž˜ν”„(DAG; Directed Acyclic Graph)의 λͺ¨λ“  λ…Έλ“œλ₯Ό λ°©ν–₯성에 거슀λ₯΄μ§€ μ•Šλ„λ‘ μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜λŠ” 것

→ μœ„μƒ 정렬은 DAG에 λŒ€ν•΄μ„œλ§Œ μˆ˜ν–‰ν•  수 μžˆλ‹€

→ μ—¬λŸ¬ 가지 닡이 μ‘΄μž¬ν•  수 μžˆλ‹€. ν•œ λ‹¨κ³„μ—μ„œ 큐에 μƒˆλ‘­κ²Œ λ“€μ–΄κ°€λŠ” μ›μ†Œκ°€ 2개 이상인 경우(λ¬Έμ œμ—μ„œ μ˜€λ¦„μ°¨μˆœ, λ‚΄λ¦Όμ°¨μˆœ λͺ…μ‹œ μ—†λ‹€λ©΄) μ—¬λŸ¬ 가지 μœ„μƒμ •λ ¬ λ…Έλ“œ κ²°κ³Όκ°€ 쑴재 κ°€λŠ₯

λͺ¨λ“  μ›μ†Œλ₯Ό λ°©λ¬Έν•˜κΈ° 전에 queueκ°€ λΉˆλ‹€λ©΄ 사이클이 μ‘΄μž¬ν•œλ‹€κ³  νŒλ‹¨ κ°€λŠ₯(사이클에 ν¬ν•¨λœ μ›μ†Œ μ€‘μ—μ„œ μ–΄λ– ν•œ μ›μ†Œλ„ queue에 듀어가지 λͺ»ν•œλ‹€) (λ˜λŠ” queueμ—μ„œ λ…Έλ“œλ₯Ό 뽑을 λ•Œλ§ˆλ‹€ 뽑은 λ…Έλ“œμ˜ κ°œμˆ˜κ°€ 카운트 λ˜μ–΄μ„œ, μ΅œμ’… 카운트 된 λ…Έλ“œμ˜ κ°œμˆ˜μ™€ κ·Έλž˜ν”„ 전체 λ…Έλ“œμ˜ κ°œμˆ˜κ°€ 같은 지 λ‹€λ₯Έ 지 λΉ„κ΅λ‘œλ„ μ•Œ 수 있음)

→ μŠ€νƒμ„ ν™œμš©ν•œ DFSλ₯Ό μ΄μš©ν•΄ μœ„μƒ μ •λ ¬ μˆ˜ν–‰λ„ κ°€λŠ₯

 

🎒 μœ„μƒμ •λ ¬ μ‹œκ°„ λ³΅μž‘λ„: O(V+E)둜 κ°„μ„ κ³Ό λ…Έλ“œμ˜ κ°œμˆ˜κ°€ 전체 μ‹œκ°„λ³΅μž‘λ„. 각각 λ…Έλ“œμ™€ 간선을 ν•œ λ²ˆμ”© ν™•μΈν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

🎒 μ§„μž…μ°¨μˆ˜(Indegree): νŠΉμ •ν•œ λ…Έλ“œλ‘œ λ“€μ–΄μ˜€λŠ” κ°„μ„ μ˜ 개수 / μ§„μΆœμ°¨μˆ˜(Outdegree): νŠΉμ •ν•œ λ…Έλ“œμ—μ„œ λ‚˜κ°€λŠ” κ°„μ„ μ˜ 개수

BFS topology sorting

β€» BFS의 queue 자료ꡬ쑰 μ‚¬μš©

β‘  μ§„μž…μ°¨μˆ˜(Indegree)κ°€ 0인 λͺ¨λ“  λ…Έλ“œλ₯Ό queue에 λ„£λŠ”λ‹€.

 

β‘‘ queueκ°€ 빌 λ•ŒκΉŒμ§€ μ•„λž˜ 2가지 과정을 λ°˜λ³΅ν•œλ‹€.

β‘‘ - 1. queueμ—μ„œ μ›μ†Œλ₯Ό κΊΌλ‚΄ ν•΄λ‹Ή λ…Έλ“œμ—μ„œ λ‚˜κ°€λŠ” 간선을 κ·Έλž˜ν”„μ—μ„œ μ œκ±°ν•œλ‹€(indegree 값을 1μ”© κ°μ†Œ)

β‘‘ - 2. μƒˆλ‘­κ²Œ μ§„μž…μ°¨μˆ˜κ°€ 0이 된 λ…Έλ“œλ₯Ό queue에 λ„£λŠ”λ‹€.

 

β‘’ 결과적으둜 각 λ…Έλ“œκ°€ queue에 λ“€μ–΄μ˜¨ μˆœμ„œκ°€ μœ„μƒ 정렬을 μˆ˜ν–‰ν•œ 결과와 κ°™λ‹€.

 

β€» μ˜ˆμ‹œ) κ·Έλž˜ν”„λŠ” DAG(사이클이 μ—†λŠ” λ°©ν–₯ κ·Έλž˜ν”„)둜 μ€€λΉ„λ˜μ–΄μ•Ό ν•œλ‹€. 사이클이 ν¬ν•¨λ˜μ–΄ μžˆλŠ” κ·Έλž˜ν”„λΌλ©΄, 사이클이 ν¬ν•¨λ˜μ–΄ μžˆλŠ” λͺ¨λ“  λ…Έλ“œλŠ” μ§„μž…μ°¨μˆ˜κ°€ 1 이상이 λœλ‹€.

β‘  Directed Acyclic Graph μ€€λΉ„

β‘‘ μ§„μž…μ°¨μˆ˜(indegree)κ°€ 0인 λ…Έλ“œ 1 queue에 λ„£κΈ°

β‘’ λ…Έλ“œ 1을 queue에 κΊΌλ‚΄κ³ , λ…Έλ“œ 1μ—μ„œ λ‚˜κ°€λŠ” κ°„μ„ (outdegree 개수 만큼) 제거

β‘£ μƒˆλ‘­κ²Œ μ§„μž…μ°¨μˆ˜κ°€ 0이 된 λ…Έλ“œ 2와 λ…Έλ“œ 5 queue에 μ‚½μž…

β‘£ 동일 λ°©λ²•μœΌλ‘œ λ…Έλ“œ 2λ₯Ό λΉΌμ„œ λ…Έλ“œ 2μ—μ„œ λ‚˜κ°€λŠ” 간선을 제거 / 그리고 μƒˆλ‘­κ²Œ μ§„μž…μ°¨μˆ˜κ°€ 0이 된 λ…Έλ“œ 3 queue에 μ‚½μž…

β‘£ κ·Έ λ‹€μŒ λ…Έλ“œ 5λ₯Ό λΉΌμ„œ 동일 λ°©λ²•μœΌλ‘œ λ…Έλ“œ 6을 queue에 μ‚½μž…

β‘£ κ·Έ λ‹€μŒ λ…Έλ“œ 3을 λΉΌκ³ , 이후 μ§„μž…μ°¨μˆ˜κ°€ 0이 된 λ…Έλ“œλŠ” μ—†μœΌλ―€λ‘œ κ·ΈλŒ€λ‘œ μœ μ§€

β‘£ λ…Έλ“œ 6을 λΉΌκ³ , 동일 λ°©λ²•μœΌλ‘œ λ…Έλ“œ 4λ₯Ό queue에 μ‚½μž…

β‘£ λ…Έλ“œ 4λ₯Ό λΉΌκ³ , 동일 λ°©λ²•μœΌλ‘œ λ…Έλ“œ 7을 queue에 μ‚½μž…

β‘£ λ…Έλ“œ 7을 꺼냄.

∴ μœ„μƒ μ •λ ¬ κ²°κ³Ό) queue에 μ‚½μž…λœ 전체 λ…Έλ“œ μˆœμ„œ: 1 → 2 → 5 → 3 → 6 → 4 → 7

code

from collections import deque

v, e = map(int,input().split()) #number of vertices, number of edges
indegree = [0] * (v+1) #initialize it to 0 in all each nodes
graph = [[] for i in range(v+1)] #graph initialization

for _ in range(e): #in each edges
    a,b = map(int,input().split()) #node a -> node b
    graph[a].append(b)
    indegree[b] += 1

def topology_sort():
    result = []
    q = deque()
    
    #1. insert nodes in a queue having zero indegrees
    for i in range(1,v+1):
        if indegree[i] == 0:
            q.append(i)

    #2. repeat until emptying the queue
    while q:
        node = q.popleft()
        result.append(node) #update result list
        for i in graph[node]:
            indegree[i] -= 1 #remove edges
            if indegree[i] == 0: #insert nodes having 0 indegree
                q.append(i)
    for i in result:
        print(i,end=' ')

topology_sort() #1 2 5 3 6 4 7
'''
7 8
1 2
1 5
2 3
2 6
3 4
4 7
5 6
6 4
'''

examples

β˜… <BOJ G3 2252 쀄 μ„Έμš°κΈ°> β˜…

: Aκ°€ B μ•žμ— μ„œμ•Ό ν•˜λŠ”, μˆœμ„œκ°€ 정해진 λ°μ΄ν„°λŠ” λ…Έλ“œ A → λ…Έλ“œ B의 연결을 λˆ„μ μœΌλ‘œ λ§Œλ“ , μœ„μƒμ •λ ¬ κ²°κ³Ό μ΅œμ’… 좜λ ₯. μœ„μƒμ •λ ¬ κΈ°λ³Έ 문제

 

β˜… <Leetcode Medium 207. Course Schedule> β˜…

: (index 0λΆ€ν„° μ‹œμž‘ 주의) bλ₯Ό μ„ μˆ˜κ°•ν•˜κ³  aλ₯Ό μˆ˜κ°•(b → a) acyclic graph만 μœ„μƒμ •λ ¬μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ, λͺ¨λ“  courses(λ…Έλ“œ)λ₯Ό 끝낼 수 μžˆλŠ”μ§€, 즉, μœ„μƒμ •λ ¬μ΄ κ°€λŠ₯ν•œμ§€(=사이클이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 지) λ¬»λŠ” 문제. 사이클 쑴재 유무 νŒλ³„μ€, queueμ—μ„œ λΊ€ λ…Έλ“œμ˜ 개수λ₯Ό 계속 μ„Έκ³ , μ΅œμ’… μ„Ό λ…Έλ“œμ˜ κ°œμˆ˜μ™€ κ·Έλž˜ν”„ 전체 λ…Έλ“œμ˜ κ°œμˆ˜κ°€ μ„œλ‘œ 같은 지 λ‹€λ₯Έ 지 λΉ„κ΅ν•˜λ©΄ λœλ‹€.

 

'Computer Science > Algorithms' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

πŸ«‚ Prefix Sum  (1) 2024.09.06
🍣 Fibonacci Sequence  (0) 2024.06.26
πŸ“² Divide&Conquer  (1) 2024.06.08
πŸš€ Power by Divide and Conquer  (1) 2024.06.06
πŸ›£οΈ Shortest Path in an Unweighted Graph  (0) 2024.05.23

λŒ“κΈ€