fdsajklt2   4년 전

플로이드 와샬을 공부하기전인데요.. 

가중치가 자연수여서 다익스트라를 사용하면 풀리겠다 싶어서 풀었는데 시간초과가 떠서 질문드립니다..

혹시 제가 다익스트라를 잘못 구현한것인지 아니면 애초에 다익스트라로 풀면 안되는 문제인지 궁금하여 질문드립니다!

chw0501   4년 전

일단은 플로이드로 푸는 것이 시간복잡도 상으로는 더 좋습니다. O(n^3)

하지만 각 정점마다의 다익스트라로도 풀 수 있습니다. O(V* ElogV)

위 코드에서 몇가지 잘못된 부분이 있습니다.

다익스트라의 구현 방식을 다시 보면 좋으실 거 같은데,

1. 25번 째 줄에서 if (arr[start][next] >= sum) 로 수정되어야 합니다. sum과 같을 때에도 그 경로에 대해서는 업데이트를 해줘야 되기 때문입니다. 

2. 사실 이것때문에 시간초과가 난 것인데 28 ~ 32번째 줄에서 아래 코드와 같이 수정되어야 합니다. 더 짧은 경로를 발견했을 때만 arr을 갱신해주고 우선순위 큐에 저장을 해야  우선순위 큐에 저장되는 간선 개수가 E개를 넘지 않을 것이기 때문입니다.

마지막으로

3. answer ==INF 일때는 -1을 출력해야 합니다.


fdsajklt2   4년 전

원래 코드가 개판이었는데... 잘 알아보시고 도움주셔서 감사합니다!!!

혹시 1번. sum이 같을때에도 포함되야한다고 하셨는데, 제 생각에는 어차피 같다면 해당 목적지까지의 거리는 변하지 않기때문에 

굳이 if문안에 들어가서 해당 목적지에서의 간선들을 봐봤자 그 전에 최단경로가 update되었을때 봤기때문에 중복된 과정이라고 생각되는데...

반례가 있을까요..?

chw0501   4년 전

sum과 같을 때 해당 목적지까지의 거리는 변하지 않지만, 그 목적지로부터 새롭게 update를 해야되기 때문에 포함되어야 합니다.

그 목적지로부터 update하는 과정은 그 전에 없었습니다.

fdsajklt2   4년 전

이제야 이해했네요! 정말 감사합니다~

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