위상 정렬 예제 - 1
Last updated
Last updated
n(학생 수) m(비교 횟수)
A(인접 리스트)
inDegree(진입 차수 리스트)
for m 반복:
인접 리스트 데이터 저장
진입 차수 리스트 초기 데이터 저장
큐 생성
for n 반복:
진입 차수 리스트의 값이 0인 학생(노드)을 큐에 삽입
while 큐가 빌 때까지:
큐에서 현재 노드를 빼면서 출력
for 현재 노드에서 갈 수 있는 노드의 개수:
다음 노드 진입 차수 리스트값 1 감소
if 다음 노드의 진입 차수가 0이면:
큐에 다음 노드 삽입import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
A = [[] for _ in range(n + 1)]
inDegree = [0] * (n + 1)
for i in range(m):
a, b = map(int, input().split())
A[a].append(b)
inDegree[b] += 1
qu = deque()
for i in range(1, n + 1):
if inDegree[i] == 0:
qu.append(i)
result = []
while qu:
now = qu.popleft()
result.append(str(now))
for next in A[now]:
inDegree[next] -= 1
if inDegree[next] == 0:
qu.append(next)
print(" ".join(result))import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
ArrayList<Integer>[] A = new ArrayList[n + 1];
int[] inDegree = new int[n + 1];
for (int i = 1; i <= n; i++) {
A[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
A[a].add(b);
inDegree[b]++;
}
Queue<Integer> qu = new LinkedList<>();
for (int i = 1; i < inDegree.length; i++) {
if (inDegree[i] == 0) {
qu.offer(i);
}
}
StringBuilder sb = new StringBuilder();
while (!qu.isEmpty()) {
int now = qu.poll();
sb.append(now).append(" ");
for (int next : A[now]) {
inDegree[next]--;
if (inDegree[next] == 0) {
qu.offer(next);
}
}
}
System.out.println(sb);
}
}