题目意思和POJ2342一样,只是多加了一个条件,如果最大方案数唯一,输出Yes,不唯一输出No
dp的是时候多加一个变量记录答案是否唯一即可
#include "stdio.h"
#include "string.h"
#include "vector"
using namespace std;
struct node
{
int fa;
vector<int>child;
}data[210];
struct comp
{
int x,y; // x记录最优值,y记录最优值是否唯一
}dp[210][2];
int vis[210];
void dfs(int cur)
{
int i,next;
vis[cur]=1;
for (i=0;i<data[cur].child.size();i++)
{
next=data[cur].child[i];
if (vis[next]==0) dfs(next);
dp[cur][1].x+=dp[next][0].x;
if (dp[next][0].y==1) dp[cur][1].y=1;
if (dp[next][0].x>dp[next][1].x)
{
dp[cur][0].x+=dp[next][0].x;
if (dp[next][0].y==1) dp[cur][0].y=1;
}
else if (dp[next][0].x<dp[next][1].x)
{
dp[cur][0].x+=dp[next][1].x;
if (dp[next][1].y==1) dp[cur][0].y=1;
}
else
{
dp[cur][0].x+=dp[next][1].x;
dp[cur][0].y=1;
}
}
}
int main()
{
int n,i,j,x,y,sum;
char a[110],b[110],name[210][110];
while (scanf("%d",&n)!=EOF)
{
if (n==0) break;
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
memset(data,0,sizeof(data));
scanf("%s",name[1]);
sum=1;
for (i=2;i<=n;i++)
{
scanf("%s%s",a,b);
for (j=1;j<=sum;j++)
if (strcmp(name[j],a)==0) break;
x=j;
if (j==sum+1)
{
sum++;
strcpy(name[sum],a);
}
for (j=1;j<=sum;j++)
if (strcmp(name[j],b)==0) break;
y=j;
if (j==sum+1)
{
sum++;
strcpy(name[sum],b);
}
data[x].fa=y;
data[y].child.push_back(x);
}
for (i=1;i<=sum;i++)
dp[i][1].x=1;
dfs(1);
if (dp[1][1].x>dp[1][0].x)
{
printf("%d ",dp[1][1].x);
if (dp[1][1].y==0) printf("Yes\n");
else printf("No\n");
}
else if (dp[1][1].x<dp[1][0].x)
{
printf("%d ",dp[1][0].x);
if (dp[1][0].y==0) printf("Yes\n");
else printf("No\n");
}
else
{
printf("%d ",dp[1][0].x);
printf("No\n");
}
}
return 0;
}