위상 정렬은 사이클이 없는 방향 그래프에서 노드 순서를 찾는 알고리즘이다.

위상 정렬에서는 항상 유일한 값으로 정렬되지 않는다. 또한, 사이클이 존재하면 노드 간의 순서를 명확하게 정의할 수 없으므로 위상 정렬을 적용할 수 없다.





import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class P2252_줄세우기 {
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>[] al = new ArrayList[N + 1];
int[] sorted = new int[N + 1];
for (int i = 1; i <= N; i++) al[i] = new ArrayList<Integer>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
al[a].add(b);
sorted[b]++;
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= N; i++) {
if (sorted[i] == 0) queue.add(i);
}
StringBuilder sb = new StringBuilder();
while (!queue.isEmpty()) {
int num = queue.poll();
sb.append(num + " ");
for (int i = 0; i < al[num].size(); i++) {
sorted[al[num].get(i)]--;
if (sorted[al[num].get(i)] == 0) queue.add(al[num].get(i));
}
}
System.out.println(sb);
}
}
