여러가지 수업을 듣는다고 가정하자.
각 수업을 수강하기위해서는 먼저 공부해야하는 선수과목들이 존재한다고 할 때, 즉 수강해야하는 과목의 순서가 있다고 할 때 수강할 수 있는 과목의 순서는?
이러한 선후관계가 존재할 때, 순서를 찾아야 한다면 위상 정렬을 사용할 수 있다.
또한, 모든 노드들이 선후관계가 정해져 있지 않을 수 있으므로 여러 가지가 존재할 수 있다.
주의 ) 위상정렬을 사용하기 위해서는 그래프가 순환하지 않아야한다.
https://www.acmicpc.net/problem/14567
package blog;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
// BOJ 14567 선수과목
public class TopologicalSort {
public static void main(String[] args) throws Exception{
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());
// 진입차수
int[] edgeCount = new int[N+1];
// 그래프
ArrayList<ArrayList<Integer>> edgeList = new ArrayList<>();
for (int i = 0; i <= N; i++) edgeList.add(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());
edgeList.get(A).add(B);
edgeCount[B]++;
}
// 선수과목번호
Queue<int[]> q = new ArrayDeque<>();
int[] ans = new int[N+1];
for (int i = 1; i <= N; i++) {
if (edgeCount[i] == 0) q.offer(new int[] {i, 1});
}
while (!q.isEmpty()) {
int[] from = q.poll();
int A = from[0];
ans[A] = from[1];
for (int i = 0; i < edgeList.get(A).size(); i++) {
int to = edgeList.get(A).get(i);
edgeCount[to]--;
if (edgeCount[to] == 0) q.offer(new int[] {to, ans[A] + 1});
}
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 1; i <= N; i++) bw.write(String.valueOf(ans[i]) + " ");
bw.flush();
br.close();
}
}
팔로우 했어요 ㅎㅎ 자주 찾아올게요