[필자 사고]
이 문제는 전형적인 다익스트라 알고리즘의 응용버전이다
필자는 대부분 1차원에서 다익스트라 알고리즘을 사용했다면 이 문제를 통해
2차원까지 확장하는 개념을 얻을 수 있게 되었다.
간단하게 다익스트라 알고리즘을 설명하자면 우선순위 큐에 가장 적은 비용의 index부터 탐색하는 방식이다.
2차원개념과 다익스트라 알고리즘을 알고 있다면 쉽게 해결할 수 있는 문제이다.
[소스 코드]
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <queue>
using namespace std;
int dy[4] = { 0,1,0,-1 };
int dx[4] = { 1,0,-1,0 };
typedef struct Node {
int cost;
int sero;
int garo;
}Node;
typedef struct cmp {
bool operator()(Node a, Node b) {
return a.cost > b.cost;
}
};
vector<vector<int>> Arr;
vector<vector<int>> pathLoad;
int N;
void Input() {
vector<vector<int>> Arr2;
vector<vector<int>> pathLoad2;
Arr2.resize(N);
pathLoad2.resize(N);
for (int i = 0; i < N; i++) {
Arr2[i].resize(N);
pathLoad2[i].resize(N, INT_MAX);
}
for (int i = 0; i < N; i++) {
for (int k = 0; k < N; k++) {
cin >> Arr2[i][k];
}
}
Arr = Arr2;
pathLoad = pathLoad2;
}
bool Inside(int sero, int garo) {
if (sero >= 0 && sero < N && garo >= 0 && garo < N)return true;
return false;
}
void Dijkstra() {
priority_queue<Node, vector<Node>, cmp> pq;
pq.push({ Arr[0][0],0,0 });
pathLoad[0][0] = Arr[0][0];
while (!pq.empty()) {
int nowSero = pq.top().sero;
int nowGaro = pq.top().garo;
pq.pop();
if (nowSero == N - 1 && nowGaro == N - 1)return;
for (int i = 0; i < 4; i++) {
int nextSero = nowSero + dy[i];
int nextGaro = nowGaro + dx[i];
if (Inside(nextSero, nextGaro) &&
pathLoad[nextSero][nextGaro] > pathLoad[nowSero][nowGaro] +
Arr[nextSero][nextGaro]) {
pathLoad[nextSero][nextGaro] = pathLoad[nowSero][nowGaro]
+Arr[nextSero][nextGaro];
pq.push({ pathLoad[nextSero][nextGaro],nextSero,nextGaro });
}
}
}
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int count = 0;
while (1) {
cin >> N;
if (N == 0)break;
count++;
Input();
Dijkstra();
cout << "Problem " << count << ": " << pathLoad[N - 1][N - 1] << '\n';
}
}
'백준 > 그래프' 카테고리의 다른 글
백준 14938 c++ "서강그라운드" -[PlusUltraCode] (2) | 2024.02.27 |
---|---|
백준 2665 c++ -[PlusUltraCode] (0) | 2024.02.27 |
백준 11779 c++ -[PlusUltraCode] (1) | 2024.02.27 |
백준 1261 c++ -[PlusUltraCode] (0) | 2024.02.26 |
백준 1504 c++ - [PlusUltraCode] (0) | 2024.02.26 |