[문제보기]
1753. 최단경로
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.
www.acmicpc.net
[풀이과정]
이 문제는 다익스트라 알고리즘을 사용하면 되는 문제이다.
[소스코드]
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int INF = 987654321;
int V, E, K;
int Dist[20001] = {0};
vector<pair<int, int>> vec[20001];
void Dijstra(){
priority_queue<pair<int, int>> pq;
// 가중치, 노드 순서 (가중치에 대한 오름차순을 만들기 위해)
pq.push({0, K});
Dist[K] = 0;
while(!pq.empty()){
int cost = -pq.top().first;
int cur = pq.top().second;
pq.pop();
for(int i=0; i<vec[cur].size(); i++){
int next = vec[cur][i].first;
int ncost = vec[cur][i].second;
if(Dist[next] > cost + ncost){
Dist[next] = cost + ncost;
pq.push({-Dist[next], next});
}
}
}
}
int main(){
cin >> V >> E >> K;
for(int i=0; i<E; i++){
int a, b, w;
cin >> a >> b >> w;
//노드, 가중치 순서
vec[a].push_back({b, w});
}
for(int i=1; i<=V; i++){
Dist[i] = INF;
}
Dijstra();
for(int i=1; i<=V; i++){
if(Dist[i] == INF)
cout << "INF" << "\n";
else
cout << Dist[i] << "\n";
}
}
'알고리즘 스터디 > Beakjoon' 카테고리의 다른 글
[백준 4256][C++] 트리 (Gold 5) (0) | 2020.10.01 |
---|---|
[백준 10026][C++] 적록색약 (Gold 5) (0) | 2020.09.29 |
[백준 2606][C++] 바이러스 (Silver 3) (0) | 2020.09.28 |
[백준 11725][C++] 트리의 부모 찾기 (Silver 2) (0) | 2020.09.28 |
[백준 1991][C++] 트리 순회 (Silver 1) (0) | 2020.09.28 |