문풀 ❓/알고리즘
[알고리즘] 1753 / 최단경로 / C++
narang111
2022. 9. 3. 16:33
#다익스트라
다익스트라를 구현하는 그 자체의 문제였다.
ios_base 이 코드를 추가해도 계속 시간초과가 떴는데 아무래도 다익스트라 알고리즘과 priority queue 이해도 부족이 아니었나 싶다.
🔽 시간초과 코드
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define MAX 20001
// 한점시작, 모든거리: 다익스트라
// 간선, 인접리스트 저장
// 거리배열 무한대 초기화
int N, M;
int INF = 1000000000;
int dist[MAX];
int visited[MAX];
vector<pair<int, int>> vec[MAX];
priority_queue<pair<int, int>> pq;
int st, ed;
void dijkstra(int start) {
dist[start] = 0;
pq.push(make_pair(start, 0));
while (!pq.empty()) {
int current = pq.top().first;
int distance = -1 * pq.top().second; // 짧은 것이 먼저 오도록 음수화
pq.pop();
// 이전에 구한 거리가 더 최소인 경우 스킵
if (dist[current] < distance) continue;
for (int i = 0; i < vec[current].size(); i++) {
int next = vec[current][i].first;
int nextdist = distance + vec[current][i].second;
if (nextdist < dist[next]) {
dist[next] = nextdist;
pq.push(make_pair(next, -1 * nextdist));
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
cin >> st;
for (int i = 1; i <= N; i++) {
dist[i] = INF;
}
for (int i = 0; i < M; i++) {
int from, to, cost;
cin >> from >> to >> cost;
vec[from].push_back({ to,cost });
}
dijkstra(st);
// cout << dist[ed] << endl;
for (int i = 1; i <= N; i++) {
if(dist[i]<1000000000) cout << dist[i] << "\n";
else cout << "INF" << "\n";
}
return 0;
}
✅ 해결코드
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define MAX 20001
// 한점시작, 모든거리: 다익스트라
// 간선, 인접리스트 저장
// 거리배열 무한대 초기화
int N, M;
int INF = 1000000000;
int dist[MAX];
int visited[MAX];
vector<pair<int, int>> vec[MAX];
priority_queue<pair<int, int>> pq;
int st, ed;
void dijkstra(int start) {
dist[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int current = pq.top().second;
int distance = -1 * pq.top().first; // 짧은 것이 먼저 오도록 음수화
pq.pop();
// 이전에 구한 거리가 더 최소인 경우 스킵
if (dist[current] < distance) continue;
for (int i = 0; i < vec[current].size(); i++) {
int next = vec[current][i].first;
int nextdist = distance + vec[current][i].second;
if (nextdist < dist[next]) {
dist[next] = nextdist; // dist에 들어가는 수는 양수
pq.push(make_pair(-1 * nextdist, next ));
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
cin >> st;
for (int i = 1; i <= N; i++) {
dist[i] = INF;
}
for (int i = 0; i < M; i++) {
int from, to, cost;
cin >> from >> to >> cost;
vec[from].push_back({ to,cost });
}
dijkstra(st);
for (int i = 1; i <= N; i++) {
if(dist[i]<1000000000) cout << dist[i] << "\n";
else cout << "INF" << "\n";
}
return 0;
}
참고하기 제일 좋은 블로그(동빈나)
23. 다익스트라(Dijkstra) 알고리즘
다익스트라(Dijkstra) 알고리즘은 다이나믹 프로그래밍을 활용한 대표적인 최단 경로(Shortest Path) 탐...
blog.naver.com