您的位置:首页 > 其它

poj - 3342 Party at Hali-Bula

2012-11-08 23:12 211 查看
树形DP,还是求最大独立集,加上判断唯一性,这题我就卡在唯一性上了。

#include <stdio.h>
#include <string.h>
#define N 205
int fst
,nxt
,v
,n,m;
int only
[2],dp
[2];
char name
[105];
int max(int a, int b)
{
return a>b ?a :b;
}
int find(char *t)
{
for(int i = 0; i < m; i++)
if(!strcmp(name[i],t))
return i;
return -1;
}
void dfs(int u)
{
int e,i;
dp[u][0] = 0;
dp[u][1] = 1;
only[u][0] = only[u][1] = 1;
for(i = fst[u]; i != -1; i = nxt[i])
{
e = v[i];
dfs(e);
dp[u][0] += max(dp[e][0],dp[e][1]);
if(dp[e][0]==dp[e][1]) only[u][0] = 0;
else if((dp[e][0] > dp[e][1]) && only[u][0])
only[u][0] = only[e][0];
else if(only[u][0])
only[u][0] = only[e][1];
dp[u][1] += dp[e][0];
if(only[u][1]) only[u][1] = only[e][0];
}
//printf("dp[%d][0]: %d\ndp[%d][1]: %d\n",u,dp[u][0],u,dp[u][1]);
}
int main()
{
int i,u;
char s[105],t[105];
while(scanf("%d",&n),n)
{
memset(fst,-1,sizeof fst);
scanf("%s",name[0]);
for(i = m = 1; i < n; i++)
{
scanf("%s %s",s,t);
u = find(t);
v[i] = find(s);
if(u == -1)
u = m, strcpy(name[m++],t);
if(v[i] == -1)
v[i] = m, strcpy(name[m++],s);
nxt[i] = fst[u];
fst[u] = i;
}
dfs(0);
if(dp[0][0] > dp[0][1])
{
printf("%d ",dp[0][0]);
printf(only[0][0] ?"Yes\n" :"No\n");
}
else if(dp[0][0] < dp[0][1])
{
printf("%d ",dp[0][1]);
printf(only[0][1] ?"Yes\n" :"No\n");
}
else
printf("%d No\n",dp[0][1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: