做道水树形动规。。。也不解释。看程序什么都懂了。
//By YY_More
#include<cstdio>
#include<algorithm>
using namespace std;
struct edge{
int point;
edge *next;
};
edge *g[1500];
bool ed[1500];
int yes[1500],no[1500],N,h,k,a;
void insert(int from,int to){
edge *p=new edge;
(*p).next=g[from];
(*p).point=to;
g[from]=p;
};
void dp(int x){
ed[x]=true;
edge *p=g[x];
while (p!=NULL){
if (!ed[(*p).point]){
dp((*p).point);
yes[x]+=min(yes[(*p).point],no[(*p).point]);
no[x]+=yes[(*p).point];
}
p=(*p).next;
}
yes[x]+=1;
}
int main(){
scanf("%d",&N);
for (int i=1;i<=N;i++){
scanf("%d%d",&h,&k);
for (int j=1;j<=k;j++){
scanf("%d",&a);
insert(h,a);
insert(a,h);
}
}
dp(0);
printf("%d\n",min(yes[0],no[0]));
return 0;
}