# 유형 : 그래프 탐색, DFS

# 난이도 : 골드 V

# 맨날 BFS 풀다가 DFS로 접근하려니까 어렵다. DFS탐색을 통해 선거구를 1,2 로 나눈다. 만약 선거구가 3개이상이라면 선거구 지역이 끊겨있는 것이다. 

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
package bj;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class p17471 {
    static int N, minValue = 99999999;
    static int arr[],connect[][],area[];
    static boolean visit[];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        arr = new int[N+1];
        for(int i=1; i<=N; i++)
            arr[i] = Integer.parseInt(st.nextToken());
        
        connect = new int[N+1][N+1];
        area = new int[N+1];
        for(int i=1; i<=N; i++) {
            st = new StringTokenizer(br.readLine());
            int iter = Integer.parseInt(st.nextToken());
            for(int j=1; j<=iter; j++) {
                int val = Integer.parseInt(st.nextToken());
                connect[i][val] = 1;
                connect[val][i] = 1;
            }
        }
        dfs(1);
        if(minValue == 99999999)
            System.out.println(-1);
        else
            System.out.println(minValue);
        
    }
    private static void dfs(int count) {
        // TODO Auto-generated method stub
        if(count == N+1) {
            int area1 = 0, area2 = 0;
            for(int i=1; i<=N; i++) {
                if(area[i] == 1)
                    area1 += arr[i];
                else
                    area2 += arr[i];
            }
            visit = new boolean[N+1];
            
            int rs = 0;
            for(int i=1; i<=N; i++) {
                if(!visit[i]) {
                    checkArea(i, area[i]);
                    rs++;
                }
            }
            if(rs == 2) {
                if(minValue > Math.abs(area1 - area2))
                    minValue =  Math.abs(area1 - area2);
            }
            return;
        }
        
        area[count] = 1;
        dfs(count+1);
        
        area[count] = 2;
        dfs(count+1);
    }
    private static void checkArea(int index, int num) {
        // TODO Auto-generated method stub
        visit[index] = true;
        for(int i=1; i<=N; i++) {
            if(connect[index][i] == 1 && !visit[i] && area[i]==num)
                checkArea(i, num);
        }
    }
}
 
cs

'백준' 카테고리의 다른 글

#백준_17070 파이프 옮기기1 - Java 자바  (0) 2020.03.19
#백준_16637 괄호 추가하기  (0) 2020.03.18
#백준_17281 ⚾ - Java 자바  (0) 2020.03.16
#백준_1986 체스 - Java 자바  (1) 2020.03.12
#백준_12761 돌다리 - Java 자바  (0) 2020.03.11

+ Recent posts