自己去学了学树状dp,第一次竟然直接过了,还是挺容易理解的,从下往上建树(递归)。注意初始化吧。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f
const int maxn=1500+10;
int dp[maxn][2];
vector<int> v[maxn];
int n,Min;
void dfs(int fa,int now)
{
int i,j,k;
for(i=0;i<v[now].size();i++){
int son=v[now][i];
if(fa!=son){
dfs(now,son);
dp[now][0]+=dp[son][1];
dp[now][1]+=min(dp[son][0],dp[son][1]);
}
}
}
void init()
{
int i;
for(i=0;i<n;i++){//注意初始化就行,
dp[i][0]=0;
dp[i][1]=1;
}
for(i=0;i<n;i++)
v[i].clear();
Min=inf;
}
int main()
{
while(EOF!=scanf("%d",&n)&&n)
{
init();
int i,j;
int fa,son,cnt;
for(i=0;i<n;i++){
scanf("%d:(%d)",&fa,&cnt);
for(j=0;j<cnt;j++){
scanf("%d",&son);
v[fa].push_back(son);
v[son].push_back(fa);
}
}
dfs(-1,0);
printf("%d\n",min(dp[0][0],dp[0][1]));
}
return 0;
}