6 Jason Jack Jason Joe Jack Jill Jason John Jack Jim Jill 2 Ming Cho Ming 0
4 Yes 1 No题意:第一行给出一个数n,表示n个人形成一棵关系树,第二行给出一个人名表示的是根节点,接下来n-1行描述的是两人有直接的上下级关系。问找出参加party的人中任意两人之间没有直接的上下级关系的最多人数,并且判断组成的人数是否唯一。#include<stdio.h> #include<iostream> #include<map> #include<string> using namespace std; struct nnn { int k; int son[205]; }node[205]; int vist[205],dp[205][2],only[205][2];//dp[p][i],i=0表示节点p不参与,i=1表示参与 int max(int a,int b) { return a>b?a:b; } void dfs(int p) { dp[p][0]=0; dp[p][1]=1; vist[p]=1; only[p][0]=only[p][1]=1;//表示唯一 for(int i=1;i<=node[p].k;i++) { int son=node[p].son[i]; if(vist[son])continue; dfs(son); dp[p][1]+=dp[son][0]; if(!only[son][0]) only[p][1]=0; dp[p][0]+=max(dp[son][0],dp[son][1]); if(dp[son][0]>dp[son][1]&&only[son][0]==0)only[p][0]=0; if(dp[son][0]<dp[son][1]&&only[son][1]==0)only[p][0]=0; if(dp[son][0]==dp[son][1]) only[p][0]=0; } } int main() { int n,m,a,b,k,maxsum; char str[2][150]; map<string,int>name; while(scanf("%d",&n)>0&&n) { m=0; name.clear(); for(int i=0;i<=n+2;i++) vist[i]=0,node[i].k=0; scanf("%s",str[0]); m++; name[str[0]]=m; for(int i=1;i<n;i++) { scanf("%s%s",str[0],str[1]); if(!name[str[0]]) { m++; name[str[0]]=m; } if(!name[str[1]]) { m++; name[str[1]]=m; } a=name[str[0]]; b=name[str[1]]; node[a].k++; k=node[a].k; node[a].son[k]=b; node[b].k++; k=node[b].k; node[b].son[k]=a; } dfs(1); int onl=1; maxsum=max(dp[1][0],dp[1][1]); if(dp[1][0]>dp[1][1]&&only[1][0]==0)onl=0; if(dp[1][0]<dp[1][1]&&only[1][1]==0)onl=0; if(dp[1][0]==dp[1][1]) onl=0; printf("%d %s\n",maxsum,onl?"Yes":"No"); } }
hdu2412Party at Hali-Bula (树形DP+记录是否唯一),布布扣,bubuko.com
hdu2412Party at Hali-Bula (树形DP+记录是否唯一)
原文:http://blog.csdn.net/u010372095/article/details/20942939