녕의 학습 기록

백준_2252 줄 세우기 (위상정렬) 본문

Algorithm/Algorithm 문제

백준_2252 줄 세우기 (위상정렬)

kjyyjk 2024. 2. 19. 15:02

 

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 BJ_2252_줄세우기 {

    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());

        int[] inDegree = new int[n+1];

        ArrayList<Integer>[] arr = new ArrayList[n+1];
        for (int i=1; i<n+1; i++) {
            arr[i] = new ArrayList<>();
        }

        int a, b;
        for (int i=0; i<m; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());

            arr[a].add(b);
            inDegree[b]++;
        }

        Queue<Integer> queue = new LinkedList<>();

        for (int i=1; i<n+1; i++) {
            if (inDegree[i] == 0) {
                queue.add(i);
            }
        }

        StringBuilder sb = new StringBuilder();
        int nowNode;
        while (!queue.isEmpty()) {
            nowNode = queue.poll();
            sb.append(nowNode).append(' ');

            for (int nextNode : arr[nowNode]) {
                if (--inDegree[nextNode] == 0) {
                    queue.add(nextNode);
                }
            }
        }

        System.out.println(sb);


    }

}
 

2252번: 줄 세우기

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

www.acmicpc.net