poj 3342

概率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;
}



转载于:https://www.cnblogs.com/xuschang-93/archive/2012/03/11/2389938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值