#include <bits/stdc++.h>
using namespace std;
typedef vector<string> vs;
typedef vector<vector<int>> vvi;
typedef vector<list<int>> vli;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef long long ll;
typedef double db;
typedef priority_queue<int> pq;
typedef vector<vector<pii>> vvp;
typedef vector<pii> vpi;
#define fi first
#define se second
#define FOR(i,s,e,d) for(int i=s;i<e;i+=d)
#define FORL(i,s,e,d) for(ll i=s;i<e;i+=d)
#define RFOR(i,s,e,d) for(int i=s;i>=e;i+=d)
#define RFORL(i,s,e,d) for(ll i=s;i>=e;i+=d)
const int maxD=1000001;
const int INF=1e9;
// 양방향 graph
int n;
vi adj[maxD], child[maxD];
int dp[maxD][2]; // 선택하느냐 안하느냐
bool visit[maxD];
bool dfs(int here){ // child 탐색
visit[here]=true;
for(int next:adj[here])
if(!visit[next]){
child[here].push_back(next);
dfs(next);
}
}
int solve(int here, bool bead){
// 부모가 ad인지 아닌지에 주어질 때 here 포함 아래 서브트리 내 필요한
// 최소 어답터 수 구함
// 0이면 false, 1이면 true
int& ret=dp[here][bead];
if(ret!=-1)
return ret;
// 두 가지 선택지
// bead가 false면 무조건 pick
int pick=1, npick=INF;
for(int next:child[here])
pick+=solve(next,true);
if(bead){
npick=0;
for(int next:child[here])
npick+=solve(next,false);
}
return ret=min(pick,npick);
}
int main(){
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
cin>>n;
FOR(i,0,n-1,1){
int a,b;
cin>>a>>b;
// 양방향
adj[a].push_back(b);
adj[b].push_back(a);
}
int test[5];
FOR(i,0,5,1)
cout<<"test : "<<test[i]<<'\n';
dfs(1); // 1에서 시작하는 dfs
memset(dp,-1,sizeof(dp)); // byte 크기로 채움
cout<<solve(1,true)<<'\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgdmVjdG9yPHN0cmluZz4gdnM7CnR5cGVkZWYgdmVjdG9yPHZlY3RvcjxpbnQ+PiB2dmk7CnR5cGVkZWYgdmVjdG9yPGxpc3Q8aW50Pj4gdmxpOyAKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiBwYWlyPGludCxpbnQ+IHBpaTsKdHlwZWRlZiB2ZWN0b3I8c3RyaW5nPiB2czsKdHlwZWRlZiB2ZWN0b3I8Ym9vbD4gdmI7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGRvdWJsZSBkYjsKdHlwZWRlZiBwcmlvcml0eV9xdWV1ZTxpbnQ+IHBxOwp0eXBlZGVmIHZlY3Rvcjx2ZWN0b3I8cGlpPj4gdnZwOwp0eXBlZGVmIHZlY3RvcjxwaWk+IHZwaTsKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIEZPUihpLHMsZSxkKSBmb3IoaW50IGk9cztpPGU7aSs9ZCkKI2RlZmluZSBGT1JMKGkscyxlLGQpIGZvcihsbCBpPXM7aTxlO2krPWQpCiNkZWZpbmUgUkZPUihpLHMsZSxkKSBmb3IoaW50IGk9cztpPj1lO2krPWQpCiNkZWZpbmUgUkZPUkwoaSxzLGUsZCkgZm9yKGxsIGk9cztpPj1lO2krPWQpCmNvbnN0IGludCBtYXhEPTEwMDAwMDE7CmNvbnN0IGludCBJTkY9MWU5OwovLyDslpHrsKntlqUgZ3JhcGgKaW50IG47CnZpIGFkalttYXhEXSwgY2hpbGRbbWF4RF07CmludCBkcFttYXhEXVsyXTsgLy8g7ISg7YOd7ZWY64qQ64OQIOyViO2VmOuKkOuDkApib29sIHZpc2l0W21heERdOwpib29sIGRmcyhpbnQgaGVyZSl7IC8vIGNoaWxkIO2DkOyDiQoJdmlzaXRbaGVyZV09dHJ1ZTsKCWZvcihpbnQgbmV4dDphZGpbaGVyZV0pCgkJaWYoIXZpc2l0W25leHRdKXsKCQkJY2hpbGRbaGVyZV0ucHVzaF9iYWNrKG5leHQpOwoJCQlkZnMobmV4dCk7CgkJfQp9CmludCBzb2x2ZShpbnQgaGVyZSwgYm9vbCBiZWFkKXsKCS8vIOu2gOuqqOqwgCBhZOyduOyngCDslYTri4zsp4Dsl5Ag7KO87Ja07KeIIOuVjCBoZXJlIO2PrO2VqCDslYTrnpgg7ISc67iM7Yq466asIOuCtCDtlYTsmpTtlZwgCgkvLyDstZzshowg7Ja064u17YSwIOyImCDqtaztlagKCS8vIDDsnbTrqbQgZmFsc2UsIDHsnbTrqbQgdHJ1ZQoJaW50JiByZXQ9ZHBbaGVyZV1bYmVhZF07CglpZihyZXQhPS0xKQoJCXJldHVybiByZXQ7CgkvLyDrkZAg6rCA7KeAIOyEoO2DneyngAoJLy8gYmVhZOqwgCBmYWxzZeuptCDrrLTsobDqsbQgcGljawoJaW50IHBpY2s9MSwgbnBpY2s9SU5GOwoJZm9yKGludCBuZXh0OmNoaWxkW2hlcmVdKQoJCXBpY2srPXNvbHZlKG5leHQsdHJ1ZSk7CglpZihiZWFkKXsKCQlucGljaz0wOwoJCWZvcihpbnQgbmV4dDpjaGlsZFtoZXJlXSkKCQkJbnBpY2srPXNvbHZlKG5leHQsZmFsc2UpOwoJfQoJcmV0dXJuIHJldD1taW4ocGljayxucGljayk7Cn0KaW50IG1haW4oKXsKCWNpbi50aWUoTlVMTCk7Cgljb3V0LnRpZShOVUxMKTsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJY2luPj5uOwoJRk9SKGksMCxuLTEsMSl7CgkJaW50IGEsYjsKCQljaW4+PmE+PmI7CgkJLy8g7JaR67Cp7ZalCgkJYWRqW2FdLnB1c2hfYmFjayhiKTsKCQlhZGpbYl0ucHVzaF9iYWNrKGEpOwoJfQoJaW50IHRlc3RbNV07CglGT1IoaSwwLDUsMSkKCQljb3V0PDwidGVzdCA6ICI8PHRlc3RbaV08PCdcbic7CglkZnMoMSk7IC8vIDHsl5DshJwg7Iuc7J6R7ZWY64qUIGRmcwoJbWVtc2V0KGRwLC0xLHNpemVvZihkcCkpOyAvLyBieXRlIO2BrOq4sOuhnCDssYTsm4AKCWNvdXQ8PHNvbHZlKDEsdHJ1ZSk8PCdcbic7CglyZXR1cm4gMDsKfQ==