관리 메뉴

한다 공부

[C++] 최단 경로, 다익스트라 본문

Dev/🤦‍♀️깨달음

[C++] 최단 경로, 다익스트라

사과당근 2022. 2. 26. 00:40

의문의 시간 초과와의  싸움

 

1753을 다익스트라로 푸는데 endl 대신 \n도 썼고

ios::sync_with_stdio(false);
cin.tie(NULL);

도 사용을 했고

 

중복을 방지하기 위해

if(w>dist[v]) //중복을 방지하기 위해 (시간 단축)
    continue;

도 사용을 했다.

이 부분이 헷갈렸는데 4->5->6 으로 가면 5이고 4->6으로 갈 때 7인 구간이 있다고 해보자

그러면 5을 거쳐 가는게 빠른데 계산을 하다가 4->6으로 가는 7인 구간을 또 거쳐가게 될 수도 있다. 그럴 때 중복을 방지하는 것이다. 당연히 5 만큼에 갈 수 있는 거리인걸 아는데 가중치 7을 가진 간선을 통해 가는 경로는 굳이 탐색해보지 않아도 되는것...

 

이 부분 때문에 시간 초과가 발생하는 다익스트라 문제도 있다고 한다.

그런데 이거까지 다 했는데 왜 시간 초과가 났을까?

 

내가 바보짓을 했기 때문이다~ 

 

priority_queue<pair<int,int>,vector<pair<int, int>>,greater<>> pq;

를 사용해서 가야할 정점과 그 정점까지 가는데의 가중치를 저장을 했다.

우선순위 큐를 사용한 이유는 가장 작은 가중치를 가진 정점을 빠르게 구하기 위해서였다.

greater<>을 사용해서 오름차순을 하면 pair의 첫 번째 요소를 기준으로 정렬이 된다.

 

그래서.. 가중치 순으로 정렬을 하고싶었으면

pq에 (가중치, 정점) 을 넣었어야 했는데 내가 pq에 (정점, 가중치)를 넣어서 시간 초과가 났던 것이다~

 

정신차리자^^

 

같은 실수를 반복하지 않기 위한 기록

'Dev > 🤦‍♀️깨달음' 카테고리의 다른 글

[C++] cin.eof()  (0) 2022.10.04
[NGiNX] 413 Request Entity Too Large  (0) 2022.07.13
[C++] segmentation fault (core dumped) : stack  (0) 2022.05.27
[C++] stable_sort  (0) 2022.02.26