[백준(Baekjoon)][자바(java)] 2252 : 줄 세우기 / 위상 정렬

728x90

 

https://www.acmicpc.net/problem/2252

 

2252번: 줄 세우기

첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의

www.acmicpc.net

 

문제 풀이

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	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()), m = Integer.parseInt(st.nextToken()), i, u, v;
		List<List<Integer>> edge_out = new ArrayList<>();
		for (i = 0; i < n; ++i)
			edge_out.add(new ArrayList<>());
		int degree_in[] = new int[n];
		for (i = 0; i < m; ++i) {
			st = new StringTokenizer(br.readLine());
			u = Integer.parseInt(st.nextToken()) - 1;
			v = Integer.parseInt(st.nextToken()) - 1;
			edge_out.get(u).add(v);
			degree_in[v]++;
		}
		br.close();
		PriorityQueue<Integer> top = new PriorityQueue<>();
		for (i = 0; i < n; ++i)
			if (degree_in[i] == 0)
				top.add(i);
		StringBuilder sb = new StringBuilder();
		int t = 0;
		while (t++ < n) {
			u = top.remove();
			sb.append((u + 1) + " ");
			for (int vv : edge_out.get(u)) {
				degree_in[vv]--;
				if (degree_in[vv] == 0)
					top.add(vv);
			}
		}
		System.out.println(sb.toString());
	}
}

 

※  위상 정렬에 대한 설명  ( https://hyunjiishailey.tistory.com/361?category=381527 )


 

반응형