无聊傻逼题???一开始被坑???
原来是所有边都要被看到,写成了所有点都要被看到。那不更简单???
感觉这个类型的树形dp比树上背包好理解。
#include <bits/stdc++.h>
using namespace std;
const int N=1505;
int n,x,u,v;
int f[N][2];
int cnt,head[N];
struct edge{int next,to;}e[N<<1];
inline void add(int u,int v)
{
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void dfs(int u,int fa)
{
f[u][1]=1;
for (register int i=head[u]; i; i=e[i].next)
if (e[i].to!=fa)
{
dfs(e[i].to,u);
f[u][0]+=f[e[i].to][1];;
f[u][1]+=min(f[e[i].to][0],f[e[i].to][1]);
}
}
int main(){
scanf("%d",&n);
for (register int i=1; i<=n; ++i)
{
scanf("%d%d",&u,&x);
u++;
while (x--) scanf("%d",&v),v++,add(u,v),add(v,u);
}
dfs(1,0);
printf("%d\n",min(f[1][0],f[1][1]));
return 0;
}