关键代码:
int dfs(int x){
vis[x]=1;
int f1=0,f2=0;
for(int i=head[x];~i;i=e[i].nxt){
if(vis[e[i].to]) continue;
int cnt=dfs(e[i].to);
f2+=f1*cnt;
f1+=cnt;
}
ans[x]=(f2+f1)*2+1;
return f1+1;
}
dfs()函数返回以x为根的子树大小,
f1当前是选一个时的方案数,f2当前是选两个的方案数,递推即可.
ans[x]就是答案.