예시
v1 에서 v2 로의 순서는 정해져도 상관x
=> 서로 순서가 관계없기 때문. 위상순서가 v1 과 v2 사이에는 정해져있지 않다.
하지만, v2 에서 v3 로의 순서는 반드시 v2 가 먼저, v3 가 나중이라는 순서가 정해져있다. (위상순서, 즉 선후수 순서가 정해져있기 떄문)
즉, 방문순서를 A-B-C-D-E 의 순서를 방문하는 것도 괜찮고,
B-A-C-D-E 순서로 방문하는 것도 괜찮지만,
C-A-B-D-E 또는 C-B-A-D-E 순서는 불가능하다!
ex. 선수-후수 과목
=> 사이클이 있는 방향 그래프인경우, 선수-후수 관계까 꼬일수있으므로 위상순서를 가지지 못한다! ( 자구-알고리즘 듣는 선후수 순서가 정해져있어야 하는데, 사이클 관계로 인해 알고리즘-자구 순서가 존재할 수도 있기때문)
=> 이떄 outgoing 간선이 없는 정점을 기준으로 알고리즘을 작성 가능하다.
v : outgoing이 없는 정점
=> outgoing 이 없다는 것은 곧 자기 다음으로 작업해줄 정점이 없다는 것이니까 우선순위가 가장 뒤에있는 마지막 정점이라는 뜻!
v에다 순서 번호를 표시한다.
그래프 G 를 복사한 그래프 H 에서 해당 정점을 삭제한다.
그렇게 새롭게 생긴 outgoing 이 없는 정점을 찾아나가면서, 즉 나의 바로 앞 순서를 가지는 정점들을 찾아내면서 방문 순서를 표시해준다!
(39 -> 38 -> 37 -> ... -> 2 -> 1)
복사된 그래프 H에서 9가 넘버링된 정점을 삭제한다.
그에 따라 삭제된 정점을 향해있던 간선들 3개가 같이 삭제될 것이다.
DFS 를 사용했으므로, DFS 특성에 따라 자기가 없어지면 (즉, 자기에 대한 작업을 다 마쳤으면) 자신을 호출했던 곳으로 돌아가는 재귀의 특성에 따라서 outgoing 간선이 없는 새로운 정점들중에 DFS 로 자신을 호출했던 정점으로 되돌아가서 8번으로 설정한다.
8 이 카운팅된 정점을 복사된 그래프 H 에서 삭제하고, 자신을 호출했던 정점을 확인해보니, outgoing 간선이 아직 남아있다.
(=> outgoing 간선이 아직 남아있는지 여부는 DFS 를 통해 알수있다 )
다른 정점 찾아보니 아까 넘버링 된 9 정점을 삭제할 때 outgoing 이 없어진 정점 2개가 남아있지 않는가? 이들에 대해 넘버링을 진행하면 된다.
7번 넘버링하고 그 정점 지우고 간선들을 지운다.