1. 程式人生 > >POJ 1463 TREE DP

POJ 1463 TREE DP

#include<iostream>
#include<cstdio>
#include<cstring>
const int maxn=6000+10;
using namespace std;
int to[maxn],beg[maxn],nex[maxn],e;
int fa[maxn],f[maxn][2],p[maxn];
void dfs(int x){
	p[x]=1;
	for(int i=beg[x];i;i=nex[i]){
		int k=to[i];
		if(!p[k]){
			dfs(k);
			f[x][0]+=f[k][1];
			f[x][1]+=min(f[k][0],f[k][1]);
		}
	}
}
void add(int x,int y){to[++e]=y;nex[e]=beg[x];beg[x]=e;  }
int main(){
	freopen("dog.in","r",stdin);
	freopen("dog.out","w",stdout);
	int i,j,k,m,n,x,y,z,root;
	while(scanf("%d",&n)!=EOF){		
		e=0;
		memset(beg,0,sizeof(beg));
		memset(p,0,sizeof(p));
		memset(fa,-1,sizeof(fa));
		memset(f,0,sizeof(f));
		for(i=0;i<n;i++)f[i][1]=1;		
		for(i=1;i<=n;i++){	
			scanf("%d:(%d)",&x,&y);
			for(j=1;j<=y;j++){
				scanf("%d",&z);
				fa[z]=x;
				add(x,z);
			}						
		}
		for(i=0;i<n;i++)
			if(fa[i]==-1){root=i;break;}
		dfs(root);
		printf("%d\n",min(f[root][1],f[root][0]));
	}
	return 0;
}