어떤 일을 하는 순서를 찾는 알고리즘이다.
1이 선행되어야 2, 3이 수행될 수 잇다.
예시
진입차수가 0인 노드를 찾아 큐에 넣는다.
큐에 넣은 노드를 빼면서 빼는 노드에 연결된 노드의 진입차수를 감소시킨다(연결된 간선을 지운다.)
진입차수가 0이 된 노드를 큐에 넣는다.
큐에 들어가있는 2번 노드를 제거하면서 연결된 노드의 진입차수를 감소시킨다.
진입차수가 0이 된 노드를 큐에 넣는다.
모든 노드를 위의 과정으로 반복 한다.
private static void topologicalSort() {
Queue<Integer> queue = new LinkedList<>();
for(int i = 1; i <= N; i++) {
// 진입차수가 0인것 == 시작지점
if(cntOfLink[i] == 0) {
queue.add(i);
}
}
// 노드의 개수만큼 반복한다.
for(int i = 0; i < N; i++) {
int curNode = queue.poll();
// 노드에서 빼면서 출력한다.
system.out.println(curNode + " ");
// 현재 노드에 연결된 노드의 진입차수를 줄여준다.
for(int nextNode : graph.get(curNode)) {
cntOfLink[nextNode]--;
// 진입차수가 0이 되었다면 큐에 넣는다.
if(cntOfLink[nextNode] == 0) {
queue.add(nextNode);
}
}
}
}