어떠한 일을 수행하는데 순서가 존재하고 순서를 위배하지 않게 나열해야 한다면 위상 정렬을 사용하자.
q
에 넣는다.q
가 비어있을 때 까지 한 학생을 뽑고 result
에 넣는다.q
에 넣어준다.result
를 출력한다.public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] line = br.readLine().split(" ");
int V = Integer.parseInt(line[0]);
int[] inDegree = new int[V + 1];
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i <= V; i++) {
graph.add(new ArrayList<>());
}
int E = Integer.parseInt(line[1]);
for (int i = 0; i < E; i++) {
line = br.readLine().split(" ");
int from = Integer.parseInt(line[0]);
int to = Integer.parseInt(line[1]);
graph.get(from).add(to);
inDegree[to]++;
}
Queue<Integer> q = new LinkedList<>();
Queue<Integer> result = new LinkedList<>();
for (int i = 1; i <= V; i++) {
if (inDegree[i] == 0) {
q.offer(i);
}
}
while (!q.isEmpty()) {
Integer from = q.poll();
result.offer(from);
for (Integer to : graph.get(from)) {
inDegree[to]--;
if (inDegree[to] == 0) {
q.offer(to);
}
}
}
while (!result.isEmpty()) {
System.out.print(result.poll() + " ");
}
}
}