1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.
www.acmicpc.net
- 다익스트라의 기본 개념적인 문제이다.
- 다익스트라에 대해서 이해하고 있다면 쉽게 풀 수 있지만, 처음 접한 알고리즘이라 그런지 코드로 구현해내는데 애를 먹었다.
- 다익스트라를 찾다 보면 플로이드 와샬, 벨만 포드 등 다른 알고리즘들에 대한 공부도 같이 된다.
#include <iostream>
#include <vector>
#include <queue>
#define INF int(10e8)
using namespace std;
int V, E, K;
int u, v, w;
int main(void)
{
cin.tie(0);
ios_base::sync_with_stdio(0);
cin >> V >> E >> K;
vector<int> answer(V+1, INF); // 각 인덱스는 각 노드까지의 최단거리를 담음
vector<vector<pair<int,int>>> nodes(V+1); // 전체 노드들 연결 정보를 담음
for(int i = 0 ; i < E ; i++) // 간선들을 연결
{
cin >> u >> v >> w; // 연결이 양방향으로 다 되는 것이 아니라, 주어진 방향으로만 연결됨을 주의
nodes[u].push_back(pair<int,int>(v,w));
}
priority_queue<pair<int,int>> pq; // 우선순위 큐를 사용하여 다음에 탐색할 최단거리 노드가 앞에 올 수 있게
pq.push(pair<int,int>(0,K)); // 시작점은 K 번으로, 거리는 0으로 설정
answer[K] = 0;
while(pq.size())
{
int pos = pq.top().second; // 다음 탐색할 노드 정보
int dist = -pq.top().first;
pq.pop();
for(int i = 0 ; i < nodes[pos].size() ; i++) // 해당 노드에서 연결된 다른 노드들 점검
{
int nextPos = nodes[pos][i].first;
int nextDist = nodes[pos][i].second;
if(dist + nextDist < answer[nextPos]) // 최단거리 갱신되는 노드들에만 대해서
{
answer[nextPos] = dist + nextDist; // 업데이트 해주고
pq.push(pair<int,int>(-(dist+nextDist), nextPos)); // 큐에 푸시
}
}
}
for(int i = 1 ; i <= V ; i++) // 최단거리들 최종적으로 출력
{
if(answer[i] == INF) cout << "INF" << '\n';
else cout << answer[i] << '\n';
}
}
'PS > BOJ' 카테고리의 다른 글
[백준] 9251.cpp : LCS (0) | 2020.08.25 |
---|---|
[백준] 1916.cpp : 최소비용 구하기 (0) | 2020.08.21 |
[백준] 1043.cpp : 거짓말 (0) | 2020.08.17 |
[백준] 1912.cpp : 연속합 (0) | 2020.08.16 |
[백준] 10844.cpp : 쉬운 계단 수 (0) | 2020.08.15 |