一道树形DP
#include <bits/stdc++.h>
using namespace std;
const int N=1505;
int dp[N][2];
vector<int> vec[N];
int n;
void dfs(int x,int fa)
{
int sum1=0,summin=0;
for(int i=0;i<vec[x].size();i++)
{
if(vec[x][i]==fa) continue;
dfs(vec[x][i],x);
sum1+=dp[vec[x][i]][1];
summin+=min(dp[vec[x][i]][1],dp[vec[x][i]][0]);
}
dp[x][0]=sum1;
dp[x][1]=summin+1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int u,v,s;
cin>>u>>s;
for(int j=1;j<=s;j++)
{
cin>>v;
vec[u].push_back(v);
vec[v].push_back(u);
}
}
memset(dp,0x3f,sizeof(dp));
dfs(0,-1);
cout<<min(dp[0][0],dp[0][1]);
return 0;
}