선거구를 두 구간으로 나누는데 나눠진 구간끼리 연결되어 있어야합니다.
dfs기반의 부분집합으로 나눌 수 있는 모든 구간을 확인합니다.
두 구간을 div1, div2라는 리스트를 사용하였고, 구역들끼리 연결되어있는지 bfs를 통해 확인합니다.
구간의 모든 구역끼리 연결되어 있으면 구역들의 합의 최솟값을 갱신합니다.
두 선거구로 나눌 수 없는 경우가 입력으로 주어질 수 있으니 그 때는 -1을 출력합니다.
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Integer> graph[] = new ArrayList[11];
static ArrayList<Integer> div1 = new ArrayList<>();
static ArrayList<Integer> div2 = new ArrayList<>();
static int list[] = new int[11];
static boolean pick[] = new boolean[11];
static boolean visit[] = new boolean[11];
static int N, ans = 2147483647;
static boolean bfs(ArrayList<Integer> div, int size, boolean t) {
Arrays.fill(visit, false);
Deque<Integer> dq = new ArrayDeque<>();
dq.add(div.get(0));
visit[div.get(0)] = true;
int cnt = 0;
while (!dq.isEmpty()) {
int x = dq.poll();
cnt++;
for (int i = 0; i < graph[x].size(); i++) {
int next = graph[x].get(i);
if (visit[next] || pick[next] != t)
continue;
visit[next] = true;
dq.add(next);
}
}
if (cnt == size)
return true;
else
return false;
}
static void func(int idx) {
if (!div1.isEmpty()) {
for (int i = 1; i <= N; i++) {
if (!pick[i])
div2.add(i);
}
if(!div2.isEmpty()) {
if (bfs(div1, div1.size(), true)) {
if (bfs(div2, div2.size(), false)) {
int sum = 0;
for (int i = 0; i < div1.size(); i++) {
sum += list[div1.get(i)];
}
for (int i = 0; i < div2.size(); i++) {
sum -= list[div2.get(i)];
}
ans = Math.min(ans, Math.abs(sum));
}
}
div2.clear();
}
}
for (int i = idx; i <= N; i++) {
div1.add(i);
pick[i] = true;
func(i + 1);
pick[i] = false;
div1.remove(div1.size() - 1);
}
}
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
list[i] = Integer.parseInt(st.nextToken());
}
int K, v;
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
K = Integer.parseInt(st.nextToken());
graph[i] = new ArrayList<>();
while (K-- > 0) {
v = Integer.parseInt(st.nextToken());
graph[i].add(v);
}
}
}
static void print() {
if (ans == 2147483647)
System.out.println(-1);
else
System.out.println(ans);
}
public static void main(String[] args) throws Exception {
input();
func(1);
print();
}
}
|
cs |
'algorithm > bfs' 카테고리의 다른 글
boj 17244 아맞다우산 (0) | 2021.11.25 |
---|---|
boj 1194 달이 차오른다, 가자. (0) | 2021.04.21 |
boj 2573 빙산 (0) | 2021.04.05 |
boj 14923 미로 탈출 (0) | 2021.03.29 |
boj 17836 공주님을 구해라! (0) | 2021.03.26 |