phcdream   3년 전

다익스트라 2번으로 풀었습니다만, 왜 다른 다익스트라3번 쓴 코드에 비해 시간이 두배넘게 걸릴까요??

다른코드는 60~80ms 인데, 170ms나 걸립니다.

170ms 코드(이 글의 아래 소스코드랑 같음)

24196119번 소스 코드 (acmicpc.net)

다익스트라3번코드

24186969번 소스 코드 (acmicpc.net)

다익스트라3번코드 최근 제출해본 링크

24196258번 소스 코드 (acmicpc.net)

+) 추가로 다익스트라 3번쓴 코드에서는 우선순위큐에서 구해놓은 거리가 더작을경우,

for문 추가로 안돌려도 되는 부분까지 실행하는데도 왜 더느릴까요??

어디서 빼먹은 구현이 있을까요??

Green55   3년 전

동적할당(new)를 빼보세요.

phcdream   3년 전

@Green55

해결했습니다. 우선순위큐의 compare 매개변수와 관련이 있었습니다.

사전지식

글 읽기 - [c++] 우선순위 큐 비교함수 (acmicpc.net)

우선순위큐 less(대신에 operator< 리턴 반대로)-> max힙이됨(가중치가 큰값부터 나오기때문에 리턴값을 반대로 하여 min힙 처럼 구현)

24204336번 소스 코드 (acmicpc.net)

우선순위큐 greater-> min힙이됨(가중치가 작은값이 먼저나오기때문에 부합함)

24203847번 소스 코드 (acmicpc.net)

이거는 비교하기 위해서 우선순위큐 대신에 그냥 큐 사용

24204197번 소스 코드 (acmicpc.net)

잘못구현된 코드-우선순위큐less가 되기 때문에 max힙이됨.가중치가 큰값부터 튀어나옴.최악임.

24203984번 소스 코드 (acmicpc.net)

시간

우선순위큐 min힙: 40~44ms

큐: 44ms

잘못구현된 우선순위큐 max힙: 176~200ms


우선순위큐 vs 큐 비교글

글 읽기 - 큐 vs 우선순위_큐 다익스트라 구현 (acmicpc.net)

이 문제에서는 E: 200000(20만), V:800 (E: 간선, V: 정점)


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