위상 정렬은 방향성이 있는 유향 그래프에서 순서가 정해져있는 정점들의 순서를 거스르지 않으면서 모든 정점을 나열하는 알고리즘입니다. 위상 정렬의 대표적인 예시는 다음과 같습니다.
예를 들어 컴퓨터공학과에서 알고리즘 과목을 수강하고자 할 때 해당 과목을 수강하기 위한 선수 과목들이 존재합니다. 즉, 알고리즘을 수강하기 위해선 자료구조를 먼저 수강해야 하며 C프로그래밍을 수강하기 위해서는 먼저 이산수학을 수강해야 할 것입니다.
순서가 존재하는 유향그래프에서 위 예시를 위상 정렬하면 다음과 같은 순서가 나타납니다.
이산수학 -> 프로그래밍 원리 -> C프로그래밍 -> 자료구조 -> 알고리즘
위상 정렬을 통해 올바른 수강순서를 찾아낼 수 있습니다. 이처럼 선후 관계가 명확한 그래프 구조에서 그 관계에 따라 정렬하는 알고리즘이 위상 정렬입니다. 위상 정렬의 순서는 구조에 따라 여러 종류가 나타날 수 있으며 그래프 내에 반드시 사이클이 존재해서는 안됩니다. 사이클이 존재하는 그래프에서는 시작 지점을 찾을 수 없으므로 위상 정렬이 불가능합니다.
알고리즘 원리
위 유향그래프에서 모든 정점들은 진입 차수를 가지고 있습니다. 진입 차수는 정점에 들어오는 간선 수를 의미합니다. 그림에서 정점 1의 진입 차수는 0이며 정점 6의 진입 차수는 2입니다.