득이공간

[백준 C++] 1753 최단경로 - 다익스트라 본문

PS/알고리즘 문제풀이

[백준 C++] 1753 최단경로 - 다익스트라

쟁득 2024. 1. 31. 10:30
 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가

www.acmicpc.net

cpp
#include <iostream> #include <vector> #include <queue> #include <climits> using namespace std; vector<vector<pair<int, int>>> Neighbors; vector<int> LinkState; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> NonVisited; // 오름차순 PQ const int& Infinite = INT_MAX; void Init(int InV, int InE, int InK) { ‌ios::sync_with_stdio(false); ‌cin.tie(NULL); ‌cout.tie(NULL); ‌Neighbors.reserve(InV); for (int i = 0; i < InV; ++i) { ‌‌Neighbors.emplace_back(vector<pair<int, int>>()); } for (int i = 0; i < InE; ++i) { ‌‌int Src, Dest, Weight; ‌‌cin >> Src >> Dest >> Weight; ‌‌Neighbors[Src - 1].emplace_back(Dest - 1, Weight); } ‌LinkState.reserve(InV); for (int i = 0; i < InV; ++i) { ‌‌LinkState.emplace_back(Infinite); } ‌LinkState[InK - 1] = 0; } void Dijkstra(int InK) { ‌NonVisited.emplace(0, InK - 1); while (!NonVisited.empty()) { ‌‌// Choose Short Distance Node ‌‌int Current = NonVisited.top().second; ‌‌NonVisited.pop(); ‌‌// Update Neighbors LinkState ‌‌for (const pair<int, int>& Neighbor : Neighbors[Current]) ‌‌{ ‌‌‌if (LinkState[Current] + Neighbor.second < LinkState[Neighbor.first]) ‌‌‌{ ‌‌‌‌LinkState[Neighbor.first] = LinkState[Current] + Neighbor.second; ‌‌‌‌NonVisited.emplace(LinkState[Neighbor.first], Neighbor.first); ‌‌‌} ‌‌} } } int main() { int V, E, K; ‌cin >> V >> E >> K; Init(V, E, K); Dijkstra(K); for (const int& Distance : LinkState) { ‌‌if (Distance == Infinite) ‌‌{ ‌‌‌cout << "INF" << '\n'; ‌‌} ‌‌else ‌‌{ ‌‌‌cout << Distance << '\n'; ‌‌} } }

 

감격의 첫 골드 문제입니다.

다익스트라 알고리즘을 이용해서 구현했습니다.

 

중요 구현 부분은 다음과 같습니다.

1. 시간복잡도 최소화를 위해서 탐색할 노드를 담을 자료구조로 벡터가 아닌 우선순위큐를 사용합니다.

2. 우선순위큐를 오름차순으로 정렬하도록 선언합니다.