您的位置:首页 > 其它

UVA 1220(p282)----Party at Hali-Bula

2016-02-25 23:54 309 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=250;
int n;
char st1[110],st2[110];
vector<string> name;
vector<int> son[maxn];
int d[maxn][3],f[maxn][3];
int ID(const string& st)
{
for(int i=0; i<name.size(); i++)
if(name[i]==st) return i;
name.push_back(st);
return name.size()-1;
}
int solve(int u,int k)
{
d[u][k]=k;
f[u][k]=1;
int num=son[u].size();
for(int i=0; i<num; i++)
{
int v=son[u][i];
if(k==1)
{
d[u][1]+=solve(v,0);
if(!f[v][0]) f[u][1]=0;
}
else
{
int tmp1=solve(v,0);
int tmp2=solve(v,1);
d[u][0]+=max(tmp1,tmp2);
if(d[v][0]==d[v][1])
f[u][0]=0;
else if(d[v][0]>d[v][1]&&(!f[v][0]))
f[u][0]=0;
else if(d[v][0]<d[v][1]&&(!f[v][1]))
f[u][0]=0;
}
}
return d[u][k];
}
void init()
{
name.clear();
for(int i=0; i<=n; i++)
son[i].clear();
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
}
#define debu
int main()
{
#ifdef debug
freopen("in.in","r",stdin);
#endif // debug
while(scanf("%d",&n)==1&&n)
{
init();
scanf("%s",st1);
ID(st1);
for(int i=0; i<n-1; i++)
{
scanf("%s %s",st1,st2);
int x=ID(st1);
int y=ID(st2);
son[y].push_back(x);
}
printf("%d ",max(solve(0,0),solve(0,1)));
bool flag=0;
if(d[0][0]>d[0][1]&&f[0][0]) flag=1;
if(d[0][0]<d[0][1]&&f[0][1]) flag=1;
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: