POJ 1463 TREE DP
阿新 • • 發佈:2018-12-30
#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; }