반응형

   문제

   https://www.acmicpc.net/problem/2252




위상정렬이란?

어떤 일을 하는 순서를 찾는 알고리즘이다.

아래 사이트를 참고하였다.

https://gmlwjd9405.github.io/2018/08/27/algorithm-topological-sort.html

위상정렬은 다양한 답을 가질수 있으며 사이클이 포함되어있다면 위상정렬은 

불가능하다.

원리는 진입차수를 이용하여 진입차수가 0인 노드를 큐에 넣어주고 큐를빼면서 

연결된 노드의 진입차수를 갱신한다. 이때 진입차수가 0이된다면 해당노드를 큐에

 넣어주는 방식으로 큐가 빌때까지 반복해주면 된다.

만약 사이클이 있다면 진입차수가 0이하로 내려가게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sys
from collections import deque
 
 
n,m=map(int,sys.stdin.readline().split())
tree=[[] for _ in range(n+1)]#트리
 
inDegree=[0 for _ in range(n+1)]#진입차수
q=deque()#사용할큐
result=[]#결과저장
 
 
for _ in range(m):
    s,e=map(int,sys.stdin.readline().split())
    tree[s].append(e)
    inDegree[e]+=1#진입차수
 
 
for i in range(1,n+1):
    if inDegree[i]==0:
        q.append(i)
 
while q:#큐가 빌때까지
    a=q.popleft()
    result.append(a)
    for t in tree[a]:
        inDegree[t]-=1#진입차수 갱신
        if inDegree[t]==0:#갱신된 진입차수가 0이라면 큐에 넣어준다.
            q.append(t)
 
print(*result)
 

cs



반응형

'알고리즘(python) > 정렬' 카테고리의 다른 글

[Python]위상정렬 백준 1005  (0) 2020.04.14
[Python]위상정렬 백준 3665  (0) 2020.04.13
[Python]정렬 백준 10814  (0) 2020.01.02
[Python]정렬 백준 1181  (0) 2020.01.02
[Python]정렬 백준 11651  (0) 2020.01.02
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기