#include <iostream>
#include <vector>
#include <queue>
#define INF 987654321
using namespace std;
int dist[1001];
vector<pair<int, int>> edge[100001];
void dijkstra(int start)
{
dist[start]=0;
priority_queue<pair<int, int>> pq;
pq.push(make_pair(0, start));
while(!pq.empty())
{
int cur=pq.top().second;
int start_to_cur_dist=-pq.top().first;
pq.pop();
for(int i=0; i<edge[cur].size(); i++)
{
int next=edge[cur][i].second;
int start_to_next_dist=start_to_cur_dist+edge[cur][i].first;
if(dist[next]>start_to_next_dist)
{
dist[next]=start_to_next_dist;
pq.push(make_pair(-start_to_next_dist, next));
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int N, M;
cin>>N>>M;
for(int i=1; i<=N; i++)
dist[i]=INF;
for(int i=1; i<=M; i++)
{
int start, end, cost;
cin>>start>>end>>cost;
edge[start].push_back(make_pair(cost, end));
}
int S, E;
cin>>S>>E;
dijkstra(S);
cout<<dist[E];
}
최단거리 역추적 할라고 이전문제 풀고있는데 왜 여기서 시간초과가 나냐...
다익스트라 쓴거는 지난 문제에서 쓴거랑 똑같아서 왜 시간초과나는지 전혀 모르겠어요.';
왜 pq에 거리 -로 관리함??
처음에 공부할때 저렇게 했어서 습관됨ㅋㅋ
아 저게 문젠가 혹시 다른풀이 보니까 별다른건 없는데 다 관리 저렇게 안하네
pq가 최소값부터 뱉는데 저러면 거리가 더 큰거부터 나오잖음
저거 종만북에서 알려준 방법임. 그냥 음수 집어넣으면 greater 안 붙여서 짧다고
?? 해결하긴 했는데 저거 pq 최댓값 뱉으라고 해놓고 내가 -로 해놔서 작은거부터 나오게 한거임 다른 코드 한줄 추가해야하더라
관심가져줘서 감사합니당
아 그러네 -로 관리하는거에 꽂혜서 햇갈렸다. ㅈㅅㅈㅅ
dist랑 edge 크기 잘못 잡아서 틀렸나?? 왜 틀렸음?? 눈버깅으로 잘 모르겠네
pq.pop() 밑라인에 if (dist[cur] < start_to_cur_dist) continue; 추가해보세요
ㅇㅇ 이거 안하면 구현 틀린거
https://www.secmem.org/blog/2019/01/09/wrong-dijkstra/
이글 읽어보세요 중간쯤에 답이 있습니다