记录编号 48811 评测结果 AAAAAAAAAA
题目名称 树的最大匹配 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2012-11-06 16:43:17 内存使用 7.07 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int n,root,sonnum[1010],son[1010][1010],f[2][1010];
long long c[2][1010];/*I'm writting the procedure about it now*/
bool una[1010];

void fillit(int pos)
{
	int i,j,to,to2,temp;
	long long temp2;
	c[0][pos]=1;
	for (i=0;i<sonnum[pos];i++)
	{
		to=son[pos][i];
		fillit(to);
		f[0][pos]+=max(f[0][to],f[1][to]);
		if (f[0][to]>f[1][to])
		{
			if (c[0][to])
				c[0][pos]*=c[0][to];
		}
		else if (f[0][to]<f[1][to])
		{
			if (c[1][to])
				c[0][pos]*=c[1][to];
		}
		else
		{
			if (c[0][to]+c[1][to])
				c[0][pos]*=c[0][to]+c[1][to];
		}
	}
	for (i=0;i<sonnum[pos];i++)
	{
		to=son[pos][i];
		temp=f[0][to]+1;
		for (j=0;j<sonnum[pos];j++)
			if (j!=i)
			{
				to2=son[pos][j];
				temp+=max(f[0][to2],f[1][to2]);
			}
		f[1][pos]=max(f[1][pos],temp);
	}
	for (i=0;i<sonnum[pos];i++)
	{
		to=son[pos][i];
		temp=f[0][to]+1;
		temp2=c[0][to];
		for (j=0;j<sonnum[pos];j++)
			if (j!=i)
			{
				to2=son[pos][j];
				temp+=max(f[0][to2],f[1][to2]);
				if (f[0][to2]>f[1][to2])
				{
					if (c[0][to2])
						temp2*=c[0][to2];
				}
				else if (f[0][to2]<f[1][to2])
				{
					if (c[1][to2])
						temp2*=c[1][to2];
				}
				else
				{
					if (c[0][to2]+c[1][to2])
						temp2*=c[0][to2]+c[1][to2];
				}
			}
		if (f[1][pos]==temp)
			c[1][pos]+=temp2;
	}
}

int main(void)
{
	freopen("treeb.in","r",stdin);
	freopen("treeb.out","w",stdout);
	int i,j,code,m,temp;
	cin>>n;
	for (i=1;i<=n;i++)
	{
		cin>>code>>m;
		for (j=1;j<=m;j++)
		{
			cin>>temp;
			son[code][sonnum[code]++]=temp;
			una[temp]=true;
		}
	}
	for (i=1;i<=n;i++)
		if (!una[i])
		{
			root=i;
			break;
		}
	fillit(root);
	cout<<max(f[0][root],f[1][root])<<endl;
	if (f[0][root]>f[1][root])
		cout<<c[0][root]<<endl;
	else if (f[0][root]<f[1][root])
		cout<<c[1][root]<<endl;
	else
		cout<<c[0][root]+c[1][root]<<endl;
	return(0);
}