문제링크 : https://www.acmicpc.net/problem/4485
아이디어
- 최소비용으로 목적지에 도착해야함 >> 다익스트라
- 다익스트라 알고리즘 내에서 간선을 통해서 이동한 값이 더 작을경우 갱신
시간복잡도 계산
- 다익스트라 알고리즘 : O(ElgE)
- 여기서 E : N^2 * 4
- O(N^2 * lg N^2)
자료구조
- 현재 거리값 dist : 최대값 N^2 * 10 = 2e5
- 전체 지도 map : 최대값 10
코드(C++)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <iostream> #include <queue> #include <tuple> using namespace std; typedef tuple<int, int, int> ti3; int dist[150][150]; int map[150][150]; const int inf = 3e5; int dy[] = {0,1,0,-1}; int dx[] = {1,0,-1,0}; int main() { ios::sync_with_stdio(0); cin.tie(0); int t=0; while(1) { fill(&dist[0][0], &dist[149][150], inf); int N; cin >> N; if(N==0) break; for(int j=0; j<N; j++) { for(int i=0; i<N; i++) { cin >> map[j][i]; } } priority_queue<ti3, vector<ti3>, greater<ti3>> pq; // 출발점 dist[0][0] = map[0][0]; pq.push({dist[0][0], 0, 0}); while(!pq.empty()) { int ec, ey, ex; tie(ec,ey,ex) = pq.top(); pq.pop(); if(dist[ey][ex] != ec) continue; for(int k=0; k<4; k++) { int ny = ey + dy[k]; int nx = ex + dx[k]; if(ny >= 0 && ny < N && nx >= 0 && nx < N) { if(dist[ny][nx] > dist[ey][ex] + map[ny][nx]) { dist[ny][nx] = dist[ey][ex] + map[ny][nx]; pq.push({dist[ny][nx], ny, nx}); } } } } t++; cout << "Problem " << t << ": " << dist[N-1][N-1] << '\n'; } return 0; } | cs |
문제유형
- 2차원 다익스트라
- 목적지 도착하는데 최소 비용 문제
- 현재 비용 표시되는 배열 추가해서, 현재보다 작으면 업데이트
'알고리즘 > 백준' 카테고리의 다른 글
백준 2579 계단 오르기 (0) | 2021.03.14 |
---|---|
백준 4179 불! (0) | 2021.03.14 |
백준 1926 그림 (0) | 2021.03.14 |
백준 1038 감소하는 수 (0) | 2021.03.14 |
백준 9019 DSLR (0) | 2021.03.13 |