728x90
위상 정렬만 알면 날먹 가능한 문제이다
https://www.acmicpc.net/problem/2252
학생들을 줄 세워야 하는데 우선순위의 일부분이 m개 주어진다
이를 위상정렬 그래프로 생각하면 반드시 정점 a(학생1) 을 먼저 방문한 이후, 정점 b(학생2) 를 방문해야 한다 라는 순서가 된다.
위상정렬에서는 정점 b를 가기 위해서는 반드시 정점 a를 지나쳐야 하므로, 진입차수(indegree)가 1 증가하게 된다.
# 위상 정렬
from collections import deque
v, e = map(int, input().split())
indegree = [0]*(v+1) # 진입 차수
graph = [[] for _ in range(v+1)]
for _ in range(e):
a, b = map(int, input().split())
graph[a].append(b)
indegree[b] += 1
def topology_sort():
result = []
q = deque()
for i in range(1, v+1):
if indegree[i] == 0:
q.append(i)
while q:
now = q.popleft()
result.append(now)
for i in graph[now]:
indegree[i] -= 1
if indegree[i] == 0:
q.append(i)
for i in result:
print(i, end=' ') # 위상 정렬의 결과 수행
topology_sort()
728x90
'Algorithm (PS)' 카테고리의 다른 글
[leetcode] valid palindrome 125 (3) | 2022.09.05 |
---|---|
[백준] 1806 부분합 in Python : 투 포인터 (0) | 2022.03.13 |
[백준] 1987 알파벳 in Python : 백트래킹 + 시간초과 해결하기.. (0) | 2022.03.01 |
[백준] 1197 최소 스패닝 트리 in Python : 크루스칼 알고리즘으로 구현 (0) | 2022.02.28 |
[백준] 5639 이진검색트리 in Python : tree 전위순회의 특성을 이용한 풀이 + EOF를 이용해서 입력받기 (0) | 2022.02.25 |