#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int N, M, X;
vector<pair<int,int>> node[2][1010];
int arr[2][1010];
void dijk(int a) {
priority_queue<pair<int, int>> pq;
arr[a][X] = 0;
pq.push({ 0,X });
while (!pq.empty()) {
int cost = -pq.top().first;
int here = pq.top().second;
pq.pop();
if (arr[a][here] < cost) continue;
for (int i = 0; i < node[a][here].size(); i++) { // 경유가 더 싼지 확인
int via_cost = node[a][here][i].second + cost;
if (via_cost < arr[a][node[a][here][i].first]) {
arr[a][node[a][here][i].first] = via_cost;
pq.push({ -via_cost , node[a][here][i].first });
}
}
}
}
int main() {
cin >> N >> M >> X;
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= 1; j++) {
arr[j][i] = 987654321;
}
}
for (int i = 1; i <= M; i++) {
int a, b, ti;
cin >> a >> b >> ti;
node[0][a].push_back({ b,ti });
node[1][b].push_back({ a,ti }); //역방향 만들어주기
}
dijk(0); //정방향
dijk(1); //역방향
int max_cost = 0;
int tmp = 0;
for (int i = 1; i <= N; i++) {
if (arr[0][i] + arr[1][i] > max_cost) {
max_cost = arr[0][i] + arr[1][i];
}
}
cout << max_cost;
return 0;
}
중요한 점은 코드내에서 y, x는 항상 해당하는 사분면의 가장 왼쪽 위라고 판단하여 시작한다.
또한 해당하는 사분면이 아니라고 판단시 size^2를 더해주고 다음 재귀를 타서 사분면을 이동시킨다.
또한, 주의해야할점은 원하는 좌표를 찾았을 때 바로 결괏값을 출력하고 리턴하여 끝내줘야 한다. 다시 main문으로 result를 끌고 오면 else문을 타고 돌아올 수 있어서 result값이 변경될 수 있다.
코드
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int N, R, C;
int result;
void Z(int y, int x, int size) { //y,x는 각각 사분면 시작 왼쪽위,왼쪽아래를 향함
if (y == R && x == C) {
cout << result;
return;
}
if (R < y+size && C < x+size && R >=y && C >= x) { // 사분면 내에 존재시
//분할재귀
Z(y, x, size / 2); // 1사분면
Z(y, x+size/2, size / 2); // 2사분면
Z(y+size/2, x, size / 2); // 3사분면
Z(y+size/2, x+size/2, size / 2); // 4사분면
}
else { //사분면 내 존재 안할시 다음사분면 이동
result += size * size;
}
}
int main() {
cin >> N >> R >> C;
Z(0, 0, (1 << N));
return 0;
}