您的位置:首页 > 其它

树形DP(Hali-Bula的晚会,uva 1220)

2016-09-20 20:01 357 查看
#include<bits/stdc++.h>
#define maxn 210
#define INF 0X3F3F3F3F
using namespace std;

int n;
map<string,int>ID;
vector<int>MAP[maxn];
int cnt;
int dp[2][maxn];
int F[2][maxn];
void dfs(int u,int f)
{
for(unsigned int i=0;i<MAP[u].size();i++)
dfs(MAP[u][i],u);
dp[1][u]++;
if(f>=1)
{
dp[1][f]+=dp[0][u];
if(F[0][u]==0) F[1][f]=0;
if(dp[0][u]==dp[1][u])
{
dp[0][f]+=dp[0][u];
F[0][f]=0;
}
else if(dp[0][u]>dp[1][u])
{
dp[0][f]+=dp[0][u];
if(F[0][u]==0) F[0][f]=0;
}
else
{
dp[0][f]+=dp[1][u];
if(F[1][u]==0) F[0][f]=0;
}
};
}

int main()
{
while(scanf("%d",&n),n)
{
for(int i=0;i<maxn;i++)
F[0][i]=F[1][i]=1;
memset(dp,0,sizeof(dp));
for(int i=0;i<maxn;i++) MAP[i].clear();
cnt=0;
ID.clear();
string u,v;
cin>>u;
ID[u]=++cnt;
for(int i=1;i<n;i++)
{
cin>>v>>u;
if(!ID[v]) ID[v]=++cnt;
if(!ID[u]) ID[u]=++cnt;
MAP[ID[u]].push_back(ID[v]);
}
dfs(1,0);
if(dp[0][1]==dp[1][1]) printf("%d No\n",dp[0][1]);
else if(dp[0][1]>dp[1][1])
{
printf("%d ",dp[0][1]);
if(F[0][1]) puts("Yes");
else puts("No");
}
else
{
printf("%d ",dp[1][1]);
if(F[1][1]) puts("Yes");
else puts("No");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: