Baekjoon(C++)/백트래킹
[BOJ - 14889] 스타트와 링크 (C++)
alswns8081
2025. 3. 22. 21:10
문제
접근방법
- 어느 팀으로 선택되는지 백트래킹을 통해서 결정하는 문제로 판단
- 문제에서 주어진 사진을 보면 i, j가 같은 { ex) (1, 1), (2, 2) } 부분을 제외하고 탐색을 하면 된다
- -> visited 배열을 N으로 설정 후 count가 N/2가 되는 지점에서 서로의 차이를 체크
코드
#include <iostream>
#include <vector>
using namespace std;
#define INF 1e9
int N;
vector<vector<int>> S;
vector<int> visited;
int min_diff = INF;
void calculate() {
int start_sum = 0, link_sum = 0;
for (int i = 0; i < N; i++) {
for (int j = i+1; j < N; j++) {
if (visited[i] && visited[j])
start_sum += (S[i][j] + S[j][i]);
else if (!visited[i] && !visited[j])
link_sum += (S[i][j] + S[j][i]);
}
}
int diff = (start_sum > link_sum ? start_sum - link_sum : link_sum - start_sum);
min_diff = min(diff, min_diff);
}
void dfs(int idx, int count) {
if (count == N/2) {
calculate();
return;
}
for (int i = idx; i < N; i++) {
if (!visited[i]) {
visited[i] = true;
dfs(i+1, count+1);
visited[i] = false;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
S.assign(N, vector<int>(N));
visited.assign(N, false);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> S[i][j];
}
}
dfs(0, 0);
cout << min_diff;
return 0;
}