반응형
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.
www.acmicpc.net
다익스트라 문제였습니다.
풀이방법
dijkstra는 greedy, dp속성을 모두 가지고 있습니다.
시작정점 start -> x -> y -> z 로 가는 경로가 있을때 start에서 x로 가는 경로들 중 가장 작은 cost에 대해 갱신하는 방식입니다.
Code
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
using pii = pair<int,int>;
int vertex,edge, start;
int dist[20001];
struct Edge { int v, w; };
vector <Edge> graph[20001];
void dijkstra(int start){
priority_queue <pii, vector<pii>, greater<pii>> pq;
dist[start] = 0;
pq.push({0,start});
while(!pq.empty()){
int cost = pq.top().first;
int x = pq.top().second;
pq.pop();
if(dist[x] < cost) continue;
for(auto g : graph[x]){
if(dist[g.v] > g.w + cost){
dist[g.v] = g.w + cost;
pq.push({dist[g.v], g.v});
}
}
}
}
int main(){
memset(dist,INF,sizeof(dist));
cin >> vertex >> edge >> start;
for(int i = 0; i < edge; i++){
int u,v,w;
cin >> u >> v >> w;
graph[u].push_back({v,w});
}
dijkstra(start);
for(int i = 1; i <= vertex; i++){
if(dist[i] == INF) cout << "INF" << '\n';
else cout << dist[i] << '\n';
}
}
'Algorithm > Dijkstra' 카테고리의 다른 글
(C++) - 백준(BOJ) 11779번 : 최소비용 구하기 2 (0) | 2021.07.29 |
---|---|
(C++) - 백준(BOJ) 21738번 : 얼음깨기 펭귄 (0) | 2021.07.25 |
(C++) - 백준(BOJ) 1504번 : 특정한 최단 경로 (0) | 2021.05.11 |
(C++) - 백준(BOJ) 1238번 : 파티 (0) | 2021.05.11 |
(C++) - 프로그래머스(2017 카카오 코드 본선) : 튜브의 소개팅 (0) | 2021.05.09 |