pichulia   4년 전

데이터 오류나 스페셜저지 오류는 아닌거같고..(아 설마 스페셜저지 오류인가?) 

진짜 궁금해서 질문글 올려봅니다.

대충 아시다시피 벨만포드 알고리즘은 O(VE)=O(NM)에 동작합니다. 이는 최단경로가 되는 simple path의 길이가 길어봐야 n-1이기 때문입니다.

모든 간선을 돌면서 노드까지의 최단거리를 갱신하는 행위를 update라고 정의해보면, 한번 update 할 때마다 path의 길이가 1만큼 증가할 것입니다.

만약 1부터 n까지 가는 경로중에 negative cycle이 있다면(이 문제에서는 음수가 아니라 양수지만 뭐 아무튼) 그 cycle의 길이만큼 update를 수행하고나서 n까지 최단경로의 길이가 달라졌을 것입니다. 역으로 말하면 cycle의 길이만큼 update를 수행해도 n까지 최단경로의 길이가 달라지지 않았다면 negative cycle이 없음을 의미합니다.


이런 논리를 바탕으로 아래의 코드를 짰는데 무자비하게도 '틀렸습니다.'를 받았습니다.(동일한 알고리즘으로 타임머신 문제는 맞았습니다를 잘 받았습니다.)

문제가 되는 부분은 114번째 줄의 cnt 값의 상한입니다.

위에서 설명한 'cycle의 길이만큼 update를 수행'하는 부분입니다.

노드의 개수가 n개이기 때문에 negative cycle의 길이도 n 이하라고 저는 생각했습니다만..  10n번을 돌아도 틀렸습니다를 받고있습니다. 하지만 해당 부분을 11n번 이상 돌리면 맞았습니다를 받고있습니다.

이것이 의미하는 바는, negative cycle의 길이가 10n 이상이라는건데..  아무리 생각해도 이렇게나 긴 cycle이 존재할리가 없을것 같습니다.


만약 제 논리에 문제가 있는 것이라면 11n이라는 횟수도 데이터에 의해서 우연히 맞은 것이고, cycle의 길이의 하한선을 나타내는 무언가가 있어서 그 친구를 알아내지 못한다면 저는 이 문제는 못푼것과 다름이 없게 됩니다...


저의 풀이나 논리에서 어느 부분이 잘못되었으며, 반례로 어떤게 있을지 같이 찾아봐주시길 부탁드립니다.


감사합니다ㅠ

pichulia   4년 전

트위터를 통해 해결했습니다. 확인결과 최악의 경우 wn번의 update가 필요할 수도 있다는 것을 알아냈습니다...


게시글에 있던 논리에서 빠진 것은..최단경로가 여러개 있을 수 있다는 것이였습니다 -_-;;

댓글을 작성하려면 로그인해야 합니다.