概率dp,不解释。
View Code
#include<iostream>
#include<map>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=201;
int dp[210][2];
vector<int>edge[maxn];
void dfs(int u,int p)
{
int i,j;
dp[u][1]=1;dp[u][0]=0;
for(i=0;i<edge[u].size();i++)
{
int v=edge[u][i];
// if(v==p) continue;
dfs(v,u);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][1],dp[v][0]);
}
}
int main()
{
map<string,int>m;
int n,i,tot;
char bos[110],a[110],b[110];
while(scanf("%d",&n),n)
{
tot=1;
for(i=0;i<=200;i++) edge[i].clear();
m.clear();
scanf("%s",bos); m[bos]=tot++;
for(int i=1;i<n;i++)
{
scanf("%s%s",a,b);
if(!m[a]) m[a]=tot++;
if(!m[b]) m[b]=tot++;
edge[m[b]].push_back(m[a]);
}
dfs(1,1); bool flag=1;
for(i=1;i<=n;i++)
{
flag=1;
if(dp[i][0]>dp[i][1])
{
for(int j=0;j<edge[i].size();j++)
{
if(dp[edge[i][j]][0]==dp[edge[i][j]][1])
{
flag=0;
break;
}
}
}
if(!flag) break;
}
printf("%d",max(dp[1][0],dp[1][1]));
if((dp[1][0]==dp[1][1])||!flag) printf(" No\n");
else printf(" Yes\n");
}
return 0;
}