From 04c483ae123ab29a25c7670885a53a850e0a85bf Mon Sep 17 00:00:00 2001 From: songyc macbook Date: Mon, 9 Mar 2026 22:21:45 +0900 Subject: [PATCH] baekjoon 20260308 --- code_study/Baekjoon/c/2533.c | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 code_study/Baekjoon/c/2533.c diff --git a/code_study/Baekjoon/c/2533.c b/code_study/Baekjoon/c/2533.c new file mode 100644 index 0000000..7befed6 --- /dev/null +++ b/code_study/Baekjoon/c/2533.c @@ -0,0 +1,56 @@ +#include +#include + +#define MAX_N 1000000 + +int dp[MAX_N + 1][2]; +bool visited[MAX_N + 1]; + +int head[MAX_N + 1]; +int to[MAX_N * 2 + 1]; +int next[MAX_N * 2 + 1]; +int edge_cnt = 0; + +void add_edge(int u, int v) { + edge_cnt++; + to[edge_cnt] = v; + next[edge_cnt] = head[u]; + head[u] = edge_cnt; +} + +int min(int a, int b) { + return a < b ? a : b; +} + +void find(int node) { + visited[node] = true; + dp[node][1] = 1; + + for(int e = head[node]; e != 0; e = next[e]) { + int child = to[e]; + + if(visited[child]) continue; + + find(child); + dp[node][1] += min(dp[child][1], dp[child][0]); + dp[node][0] += dp[child][1]; + } +} + +int main() { + int N; + if(scanf("%d", &N) != 1) return 0; + + for(int i = 0; i < N - 1; i++) { + int u, v; + scanf("%d %d", &u, &v); + add_edge(u, v); + add_edge(v, u); + } + + find(1); + + printf("%d\n", min(dp[1][0], dp[1][1])); + + return 0; +}