PS/Problems
[Java] 백준 2533번 사회망 서비스 - Dynamic Programming
CalicoCat22
2022. 4. 30. 14:11
https://www.acmicpc.net/problem/2533
부모 노드가 adapter인 경우와 그렇지 않은 경우를 나누어
dp[n][1], dp[n][0] 로 구분해 dp를 적용한 것이 인상깊었다.
import java.util.*;
import java.io.*;
public class g3_2533_adapter {
static FastScanner fs = new FastScanner();
static PrintWriter pw = new PrintWriter(System.out);
static Node[] nodes;
static int n;
static int[][] dp;
public static void main(String[] args) {
n = fs.nextInt();
nodes = new Node[n + 1];
dp = new int[n + 1][2];
for (int i=0;i<=n;i++) nodes[i] = new Node();
for (int i=0;i<n-1;i++){
int a = fs.nextInt(), b = fs.nextInt();
nodes[a].linked.add(b);
nodes[b].linked.add(a);
}
solve(-1, 1);
pw.println(Math.min(dp[1][0], dp[1][1]));
pw.close();
}
static void solve(int par, int chi){
int sum = 0;
for (Integer i : nodes[chi].linked){
if (i != par){
solve(chi, i);
sum += dp[i][1];
}
}
dp[chi][0] = sum;
sum = 0;
for (Integer i : nodes[chi].linked){
sum += Math.min(dp[i][0], dp[i][1]);
}
dp[chi][1] = sum + 1;
}
static class Node{
List<Integer> linked = new LinkedList<>();
}
// ----------input function----------
static void sort(int[] a) {
ArrayList<Integer> L = new ArrayList<>();
for (int i : a)
L.add(i);
Collections.sort(L);
for (int i = 0; i < a.length; i++)
a[i] = L.get(i);
}
static class FastScanner {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer("");
String next() {
while (!st.hasMoreTokens()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
int[] readArray(int n) {
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = nextInt();
return a;
}
long nextLong() {
return Long.parseLong(next());
}
}
}