반응형
https://www.acmicpc.net/problem/17471
17471번: 게리맨더링
선거구를 [1, 4], [2, 3, 5, 6]으로 나누면 각 선거구의 인구는 9, 8이 된다. 인구 차이는 1이고, 이 값보다 더 작은 값으로 선거구를 나눌 수는 없다.
www.acmicpc.net
1.문제설명
2.문제풀이코드 C++
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
int N, population[11]; //인구수
vector<int> adj[11];
bool group[11]; //group 표시
int ans = INT_MAX;
int calDifference() {
int firstGroupPeople = 0, secondGroupPeople = 0;
for (int i = 1; i <= N; i++) {
if (group[i]) {
firstGroupPeople += population[i];
} else {
secondGroupPeople += population[i];
}
}
return abs(firstGroupPeople - secondGroupPeople);
}
bool executeBFS(int startNode) {
queue<int> Q;
bool ch[11] = {0};
Q.push(startNode);
ch[startNode] = 1;
while (!Q.empty()) {
int cur = Q.front();
Q.pop();
for (auto nx: adj[cur]) {
if (!ch[nx] && group[cur]==group[nx]) {
ch[nx] = 1;
Q.push(nx);
}
}
}
for (int i = 1; i <= N; i++) {
if ((group[i] == group[startNode]) && (ch[i] != 1)) {
return false;
}
}
return true;
}
bool BFS() {
//각 그룹 시작점 설정
int groupOneNode = -1, groupTwoNode = -1;
for (int i = 1; i <= N; i++) {
if (groupOneNode != -1 && groupTwoNode != -1) break;
else if (group[i] == 0) groupOneNode = i;
else groupTwoNode = i;
}
if(groupOneNode ==-1 || groupTwoNode == -1) return false;
if (executeBFS(groupOneNode) && executeBFS(groupTwoNode)) return true;
else return false;
}
void bruteForce(int L) {
if (L == N + 1) {
if (BFS()) {
ans = min(ans, calDifference());
}
return;
} else {
group[L] = 0;
bruteForce(L + 1);
group[L] = 1;
bruteForce(L + 1);
}
}
void Input();
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
Input();
bruteForce(1);
if (ans == INT_MAX) cout << -1 << '\n';
else cout << ans << '\n';
return 0;
}
void Input() {
cin >> N;
for (int i = 1; i <= N; i++)
cin >> population[i];
for (int i = 1; i <= N; i++) {
int adjacentNumbers;
cin >> adjacentNumbers;
for (int j = 0; j < adjacentNumbers; j++) {
int num;
cin >> num;
adj[i].push_back(num);
}
}
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 17837번 : 새로운 게임 2 - 시뮬레이션 Cpp (0) | 2022.07.12 |
---|---|
백준 17779번 : 게리맨더링 2 - brute Force cpp (0) | 2022.07.10 |
백준 15685번: 드래곤 커브 - 구현 C++ (0) | 2022.07.05 |
백준 16434번 : 드래곤 앤 던전 - 이분탐색, 구현 C++ (0) | 2022.07.04 |
백준 6236번 : 용돈 관리 - 이분탐색(매개변수 탐색) C++ (0) | 2022.07.03 |