DOTY
6) 백준 1753 - 최단경로 본문
728x90
반응형
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
다익스트라 알고리즘을 사용했다.
#include <bits/stdc++.h>
using namespace std;
int vertex[20001]; // 정점으로 부터의 길이
int dij[20001];
int INF = 999999;
int main(void) {
fill_n(dij, 20001, 11);
fill_n(vertex, 20001, 999999);
vector<vector<pair<int, int>> > dij(20001);
int V, E, K, u, v, w;
cin >> V >> E;
cin >> K;
for(int i = 0; i < E; i++) {
cin >> u >> v >> w;
dij[u].push_back(make_pair(v, w));
}
vertex[K] = 0;
priority_queue<pair<int, int> > q;
q.push(make_pair(-vertex[K], K));
while(!q.empty()) {
int start_point_vxt = -q.top().first;
int start_point = q.top().second;
for(int i = 0; i < dij[start_point].size(); i++) {
int target = dij[start_point][i].first;
if(vertex[target] > dij[start_point][i].second + vertex[start_point]) {
vertex[target] = dij[start_point][i].second + vertex[start_point];
q.push(make_pair(-vertex[target], dij[start_point][i].first));
}
}
q.pop();
}
for(int i = 1; i <= V; i++) {
if(vertex[i] < INF) {
cout << vertex[i] << "\n";
}
else {
cout << "INF" << "\n";
}
}
return 0;
}
초기화 할때 0이 아닌 다른 수로 초기화를 하고 싶으면 memset이 아닌 fill_n을 사용해야한다!!
fill_n([배열명], [숫자를 변경(0부터)할 배열의 index수], [변경할 숫자]);
vertex 배열
- K(시작 vertex)를 기준으로 각 Vertex에게 가는 비용 정리 ( 못갈 경우 999999, 본인(K)은 0 )
dij 배열
- 처음에는 문제의 최대인 [200001][200001]로 했더니 메모리 초과....
- 2차 vector로 사용
- dij의 1차는 시작 Vertex, 2차는 pair로서 첫번째는 도착 Vertex 두번째는 비용
target : 어떤 Vertex(start_point)에서 이동이 가능한 Vertex들
Queue를 사용하면 시간이 너무 오래 걸린다.
다익스트라를 사용할 때는 최단 거리를 먼저 사용하므로 priority_queue를 사용하자.
단, top의 경우 큰 숫자로 정렬이 되기 때문에 음수값으로 저장하자. (다익스트라는 적은 비용부터 계산)
728x90
반응형
'Algorithm > Dynamic Programming' 카테고리의 다른 글
8) 백준 13549 - 숨바꼭질3 (0) | 2023.01.31 |
---|---|
7) 백준 1916 - 최소비용 구하기 (0) | 2023.01.30 |
5) 백준 11052 - 카드 구매하기 (0) | 2020.12.04 |
4) 백준 1912 - 연속합 (0) | 2020.11.10 |
3) 백준 1932 - 정수 삼각형 (0) | 2020.11.10 |
Comments