본문 바로가기

ProgramSoliving

백준 : 2113 java

반응형

트리의 독립집합 문제는 메모이제이션을 이용해서 풀었다.

 

기본적으로 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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package algo;
 
 
public class B2113 {
    static int N;
    static int W[];
    static int dp[][];
 
    static class Pair {
        int node;
        int t;
 
        public Pair(int node, int t) {
            super();
            this.node = node;
            this.t = t;
        }
    }
 
    static ArrayList<Integer> edge[];
    static ArrayList<Pair> p[][];
    static ArrayList<Integer> ans;
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        // ---------------------Input------------------------
        N = Integer.parseInt(br.readLine());
        W = new int[N + 1];
        dp = new int[2][N + 1];
        st = new StringTokenizer(br.readLine());
 
        for (int i = 1; i <= N; i++)
            W[i] = Integer.parseInt(st.nextToken());
 
        edge = new ArrayList[N + 1];
        p = new ArrayList[N + 1][2];
 
        // 0 은 false 1 은 true
        for (int n = 1; n <= N; n++) {
            edge[n] = new ArrayList<Integer>();
            p[n][0= new ArrayList<Pair>();
            p[n][1= new ArrayList<Pair>();
        }
 
        for (int i = 0; i < N - 1; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            edge[u].add(v);
            edge[v].add(u);
        }
 
        // ---------------------------------------------
 
        int start = Solve();
        // start로 시작해서 ans에 답리스트를 채우기
        ans = new ArrayList<Integer>();
        StringBuilder sb= new StringBuilder();
        
        sb.append(getValue(1, start)).append('\n');
        Collections.sort(ans);
        for(int n : ans) {
            sb.append(n).append(' ');
        }
        System.out.print(sb.toString());
    }
 
    public static int getValue(int n, int t) {
        int sum = 0;
        if (t == 1) {
            ans.add(n);
            sum = W[n];
        }
        for (Pair next : p[n][t]) {
            sum+=getValue(next.node, next.t);
        }
 
        return sum;
    }
 
    static boolean visit[];
 
    public static int Solve() {
        Arrays.fill(dp[0], -1);
        Arrays.fill(dp[1], -1);
        visit = new boolean[N + 1];
        if (dfs(1true> dfs(1false)) {
            return 1;
        } else {
            return 0;
        }
 
    }
 
    public static int dfs(int n, boolean t) {
        int tt = t ? 1 : 0;
        if (dp[tt][n] != -1) {
            return dp[tt][n];
        }
        int sum = t ? W[n] : 0;
 
        visit[n] = true;
 
        if (t) {
            // that t is true is next node only pick false
            for (int next : edge[n]) {
                if (visit[next])
                    continue;
                p[n][tt].add(new Pair(next, 0));
                sum += dfs(next, false);
            }
        } else {
            // that t is false is next node pick true or false
            for (int next : edge[n]) {
                if (visit[next])
                    continue;
                if (dfs(next, false> dfs(next, true)) {
                    p[n][tt].add(new Pair(next, 0));
                    sum += dfs(next, false);
                } else {
                    p[n][tt].add(new Pair(next, 1));
                    sum += dfs(next, true);
                }
 
            }
 
        }
 
        visit[n] = false;
        return dp[tt][n] = sum;
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 3025 java (돌 던지기)  (0) 2020.05.04
백준 : 2116 자바  (0) 2020.05.03
백준 16933: java  (0) 2020.04.30
백준 : 7682  (0) 2020.04.15
백준 : 10775  (0) 2020.04.15