코딩테스트
백준 2252번 줄 세우기(자바) - 위상정렬 알고리즘
leeeehhjj
2022. 7. 21. 17:10
2252번: 줄 세우기
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의
www.acmicpc.net
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
static int[] indegree;
static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int m = sc.nextInt();
indegree = new int[n+1];
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
graph.get(a).add(b);
indegree[b]++;
}
topologySort();
}
static void topologySort() {
Queue<Integer> que = new LinkedList<>();
ArrayList<Integer> result = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if (indegree[i] == 0) {
que.offer(i);
}
}
while (!que.isEmpty()) {
int now = que.poll();
result.add(now);
for (int i = 0; i < graph.get(now).size(); i++) {
indegree[graph.get(now).get(i)]--;
if (indegree[graph.get(now).get(i)] == 0)
que.offer(graph.get(now).get(i));
}
}
for (int i = 0; i < result.size(); i++) {
System.out.print(result.get(i) + " ");
}
}
}