记录编号 |
48811 |
评测结果 |
AAAAAAAAAA |
题目名称 |
树的最大匹配 |
最终得分 |
100 |
用户昵称 |
Truth.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);
}