n = read_line.to_i if n <= 3 puts 1 exit end g = Array.new(n) { [] of Int32 } (n - 1).times do a, b = read_line.split.map(&.to_i) g[a - 1] << b - 1 g[b - 1] << a - 1 end q = [0] parent = Array.new(n, -1) n.times do |i| cur = q[i] g[cur].each do |adj| next if parent[cur] == adj parent[adj] = cur q << adj end end dp0 = Array.new(n, n) dp1 = Array.new(n, n) (n - 1).downto(0) do |i| cur = q[i] par = parent[cur] if g[cur].size == 1 && i != 0 dp0[cur] = 1 dp1[cur] = 0 next end cvs = [] of Tuple(Int32, Int32) sum_1 = 1 g[cur].each do |adj| next if par == adj sum_1 += dp1[adj] cvs << {dp0[adj], dp1[adj]} end cvs.sort_by! { |v0, v1| v0 - v1 } hc = g[cur].size // 2 + 1 if hc <= cvs.size dp0[cur] = 0 hc.times do |j| dp0[cur] += cvs[j][0] end hc.upto(cvs.size - 1) do |j| dp0[cur] += cvs[j][1] end end if hc - 1 <= cvs.size dp1[cur] = 0 (hc - 1).times do |j| dp1[cur] += cvs[j][0] end (hc - 1).upto(cvs.size - 1) do |j| dp1[cur] += cvs[j][1] end end dp0[cur] = {dp0[cur], sum_1}.min dp1[cur] = {dp1[cur], sum_1}.min end puts dp0[0]