문제

링크

풀이

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
 
void dfs(int node, vector<int> adj[], vector<vector<int>>& dp, vector<bool>& visited) {
  visited[node] = true;
  dp[node][0] = 1;
  for (int child : adj[node]) {
    if (visited[child]) continue;
    dfs(child, adj, dp, visited);
    dp[node][0] += min(dp[child][0], dp[child][1]);
    dp[node][1] += dp[child][0];
  }
}
 
void solve(void) {
  int n; cin >> n;
  vector<int> adj[n+1];
  for (int i=0; i<n-1; i++) {
    int u, v; cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
 
  vector<vector<int>> dp(n+1, vector<int>(2, 0));
  vector<bool> visited(n+1, false);
  dfs(1, adj, dp, visited);
 
  cout << min(dp[1][0], dp[1][1]);
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  solve();
  return 0;
}