A B ๊ฐ ์ฃผ์ด์ง๋ฉด A๊ฐ B์ ์์ ์ ๋ค๋ ๋ป์ด ๋๋ค. ์ด๋ค ์์๋ก ์ค์ ์๊ฒ ๋๋์ง ๊ตฌํ๋ ๋ฌธ์ ๋ก ๋ต์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์กด์ฌํ ์ ์๋ค.
์ฒ์์๋ dp๋ ๋์ ํฉ ์ ๋๋ก ํ ์ ์๊ฒ ๋ค ์๊ฐํ๊ณ A ๊ฐ ์์ ์์ผ๋ -1์ ํ๊ณ B ๊ฐ ๋ค์ ์์ผ๋ +1์ ํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ ์ ๋ ์์ ์๋์ง, ์ด๋ ์ ๋ ๋ค์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฐ์ง๊ณ ํ๋จํ๋ ค๊ณ ํ์ง๋ง ํ ์คํธ์ผ์ด์ค์ฒ๋ผ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ ํต๊ณผํ๋๋ฐ ๋ณต์กํ ๊ทธ๋ํ ํํ๋ฅผ ๋ ๊ฒฝ์ฐ๋ ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ ์ฐพ์๋ณด๋ ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํ๋ค.
์์ ์ ๋ ฌ์ ์์ ๊ฐ์ด ๋ฐฉํฅ์ด ์๋ ๋น์ํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํ๋ค. ์ํ์ ํ๊ฒ ๋๋ฉด ์์๋ฅผ ์ ํ ์ ์๊ณ , ๋ฐฉํฅ์ด ์์ด๋ ์์๋ฅผ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ์ ๋ ฌ์ ํ๊ธฐ ์ํด์๋ 2๊ฐ์ง๊ฐ ํ์ํ๋ค. ์ง์ ์ฐจ์์ ํด๋น ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ค์ ์ ์ ์ ๋ํ ์ ๋ณด์ด๋ค. ์ง์ ์ฐจ์๋ ํด๋น ์ ์ ์ผ๋ก ๋ค์ด์ค๋ ์ ์ ์ ๊ฐ์์ด๊ณ , ์ฐ๊ฒฐ๋ ๋ค์ ์ ์ ์ ๋ํ ์ ๋ณด๋ค์ ๋ฆฌ์คํธ ํํ๋ก ์ ์ฅํ๊ฒ ๋๋ค.
์ง์ ์ฐจ์๊ฐ 0์ธ ์ ์ ๋ถํฐ ์์์ ํ๊ฒ ๋๋ค. ์์ ์ ์ ์ ๊ฐ์๋ ์ฌ๋ฌ ๊ฐ์ผ ์ ์๋ค. ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ชจ๋ ์ ์ ์ ๋ํด ํ์ ์ ์ฅํ๊ณ ํ๋์ฉ ๊บผ๋ด์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ ์ ๋ค์ ๋ํด ์ง์ ์ฐจ์๋ฅผ 1์ฉ ๊น์์ค๋ค. ์ด๋ ๊ฒ ํด๋๊ฐ๋ฉด์ ๋ ์๋กญ๊ฒ ์ง์ ์ฐจ์๊ฐ 0์ด ๋๋ ์ ์ ๋ค์ ๋ํด ํ์ ์ ์ฅํ๋ ๋ฐฉ์์ ๋ฐ๋ณตํ๋ค. ํ์์ ๊บผ๋ด๋ ์์๊ฐ ์์ ์ ๋ ฌ์ ์งํํ ์์๊ฐ ๋๋ค.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] inDegree = new int[N]; // ์ง์
์ฐจ์
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < N; i++) {
graph.add(new ArrayList<>());
}
int A;
int B;
for (int i = 0; i < M; i++) {
A = sc.nextInt();
B = sc.nextInt();
inDegree[B-1]++;
graph.get(A-1).add(B-1);
}
Queue<Integer> queue = findStart(inDegree);
StringBuilder sb = new StringBuilder();
while (!queue.isEmpty()) {
int node = queue.poll();
sb.append(node+1)
.append(" ");
List<Integer> linkedNode = graph.get(node);
for (Integer i : linkedNode) {
inDegree[i]--;
if (inDegree[i] == 0) {
queue.add(i);
}
}
}
System.out.println(sb);
}
private static Queue<Integer> findStart(int[] inDegree) {
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < inDegree.length; i++) {
if (inDegree[i] == 0) {
queue.add(i);
}
}
return queue;
}
}