dp[][3]
dp[i][0] 表示第i个节点和他所有孩子们都在一个环里了(i在环里);
dp[i][1] 表示第i个节点的孩子们都在一个环里了(i不在环里);
dp[i][2] 表示第i个节点除了一条孩子链的其他孩子都在环里了(i不在环里)。
int vis[109];
int dp[109][3];
struct node
{
int ch[109];
int num;
}no[109];
vector<int>v[109];
void build(int a)
{
vis[a] = 1;
no[a].num = 0;
for(int i=0; i<v[a].size(); i++)
if(vis[ v[a][i] ]==0)
{
no[a].ch[no[a].num++] = v[a][i];
build( v[a][i] );
}
}
void treedp(int a)
{
if( no[a].num == 0 )
{
dp[a][0] = inf;
dp[a][1] = 0;
dp[a][2] = inf;
return;
}
int i, j, k;
for(i=0; i<no[a].num; i++)
treedp( no[a].ch[i] );
int sum = 0;
int len = no[a].num;
for(int i = 0; i < len; i++)
sum += dp[ no[a].ch[i] ][0];
dp[a][1]=sum;
dp[a][2]=inf;
dp[a][0]=inf;
for(i=0;i<len;i++)
{
int b = no[a].ch[i];
sum=0;
for(j=0;j<len;j++)
if(i!=j)
sum+=dp[ no[a].ch[j] ][0];
int p = min(dp[b][1], dp[b][2]);
dp[a][2]=min(dp[a][2], sum + p);
dp[a][0]=min(dp[a][0], sum + dp[b][2]+1);
}
for(i = 0; i <len; i++)
for(j=i+1; j<len; j++)
{
int b1= no[a].ch[i] , b2= no[a].ch[j] ;
sum=0;
for(int k=0; k<len; k++)
if(k!=i&&k!=j)
sum += dp[ no[a].ch[k] ][0];
int p1 = min(dp[b1][2], dp[b1][1]);
int p2 = min(dp[b2][2], dp[b2][1]);
dp[a][0]=min(dp[a][0], sum+p1+p2+1);
}
}
int main()
{
int n, a, b;
scanf("%d",&n);
for(int i=0; i<=n; i++) v[i].clear();
for(int i=1; i<n; i++)
{
scanf("%d%d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
memset(vis, 0, sizeof(vis));
build(1);
treedp(1);
if(dp[1][0]>=inf) puts("-1");
else printf("%d\n", dp[1][0]);
return 0;
}