AC的第一道水树形DP,纪念下!详解以后再说,理由同上,嘿嘿!那个判断是否唯一借鉴的别人的思想! #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 205 #define Max(a,b) a>b?a:b int G[N][N]; //存子节点个数,及坐标 int dp[N][2]; //存值 int n,last,flag; char name[N][N]; int Get_id(char *str) { int i; for(i=0;i<last;i++) if(strcmp(name[i],str)==0)return i; strcpy(name[last++],str); return i; } void DP(int u) { int i,v; for(i=1;i<=G[u][0];i++){ v=G[u][i]; DP(v); dp[u][1]+=dp[v][0]; dp[u][0]+=Max(dp[v][0],dp[v][1]); if(dp[u][0]==dp[u][1]&&dp[v][0]==dp[v][1]) flag=0; } } void Init() { int i,a,b; char boss[N/2],emp[N/2]; for(i=0;i<n;i++){ dp[i][0]=0; dp[i][1]=1; G[i][0]=0; } last=0; flag=1; scanf("%s",name[last++]); for(i=1;i<n;i++){ scanf("%s %s",emp,boss); a=Get_id(emp); b=Get_id(boss); G[b][++G[b][0]]=a; } } int main() { while(scanf("%d",&n),n){ Init(); DP(0); if(dp[0][0]==dp[0][1]) printf("%d No/n",dp[0][0]); else printf("%d %s/n",Max(dp[0][0],dp[0][1]),flag?"Yes":"No"); } return 0; }