방금 풀어서 맞았는데 아마 긴 글이 될 것 같군요....
우선 질문자님 접근 방식은 시간초과가 뜰 것입니다.
왜냐하면 각 점에서 다익스트라를 돌리시는데 다익스트라가 O(Vlog E + E)인데 E가 최대 V^2까지 들어오니
O(V^2)이라고 생각할 수 있고 각 점마다 돌리시니 최종적으로는 O(V^3)이 되어 플로이드 와샬과 동일해집니다.
문제를 잘 읽으시면 규칙을 확인할 수 있습니다.
다음을 수학적으로 증명해보시기 바랍니다.
임의의 노드 a,b 사이의 길이 k인 path S은 다음과 같이 나타낼 수 있다.(S_1=a,S_k=b)
S_1 -> S_2 -> S_3 -> ... -> S_k
이 path가 존재한다면 다음 path가 존재한다.
(S_1+1)%N -> (S_2+1)%N -> .... ->(S_k+1)%N
즉 a,b 사이에 path가 있으면 (a+1)%N,(b+1)%N 사이에 path가 존재한다.
위 사실로부터 다익스트라를 한번 돌리면 답을 얻을 수 있습니다.
그런데....이 문제 메모리가 굉장히 타이트합니다.
priority queue로 구현하면 동일 노드가 큐 안에 여러번 존재할 수 있고 공간복잡도적으로 좋지 않습니다.
노드의 수가 적으니 시간복잡도를 다소 포기하고 공간복잡도를 좋게 개선하시면 정답을 맞추실 수 있을겁니다.
이건 그렇게 어렵지 않으니 한번 고민해보시기 바랍니다.
만약 하시다 막히시면 이 글에 답글 달아주세요
alsrl9 3년 전
정점 개수가 최대 2000개이기 때문에 플로이드-와샬로 접근은 불가능하다고 판단해서
각 정점을 시작점으로 다익스트라 알고리즘을 구현했습니다.
다익스트라를 구현하면서 메모리 초과 판정을 받는 것 같은데
어떻게 해야 이 이상 메모리를 절약할 수 있을지 모르겠습니다.
비슷한 방법으로 접근하신 분이 있다면 조언해주시면 감사하겠습니다 !