๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Problem Solving

[Java] ๋ฐฑ์ค€ 2252 - ์ค„ ์„ธ์šฐ๊ธฐ

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

 


ํ’€์ด

์œ„์ƒ์ •๋ ฌ ๊ธฐ์ดˆ ๋ฌธ์ œ.

(ํ‚ค ์ž‘์€ ์‚ฌ๋žŒ) → (ํ‚ค ํฐ ์‚ฌ๋žŒ)  ์ด๋ ‡๊ฒŒ ๊ฐ„์„ ์„ ์ด์–ด์ฃผ๊ณ 

indegree๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ง€์›Œ๋‚˜๊ฐ€๋Š” ์‹์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ.

 


์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class Main {
	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<ArrayList<Integer>> adj = new ArrayList<>();
		int[] indegree = new int[N + 1];

		for (int i = 0; i <= N; i++) {
			adj.add(new ArrayList<>());
		}

		while (M-- > 0) {
			st = new StringTokenizer(br.readLine());
			int A = Integer.parseInt(st.nextToken());
			int B = Integer.parseInt(st.nextToken());
			adj.get(A).add(B);
			indegree[B]++;
		}

		Queue<Integer> que = new LinkedList<>();
		StringBuilder result = new StringBuilder();
		int cnt = 0;

		for (int i = 1; i <= N; i++) {
			if (indegree[i] == 0) {
				que.add(i);
			}
		}

		while (!que.isEmpty()) {
			int cur = que.remove();
			result.append(cur).append(' ');
			cnt++;

			for (int next : adj.get(cur)) {
				if (--indegree[next] == 0) {
					que.add(next);
				}
			}
		}

		if (cnt < N) {
			System.out.println("Cycle detected");
		} else {
			System.out.println(result);
		}

		br.close();
	}
}