记录编号 494762 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011] 聪聪可可 最终得分 100
用户昵称 Gravatarサイタマ 是否通过 通过
代码语言 C++ 运行时间 0.416 s
提交时间 2018-04-13 17:27:16 内存使用 0.71 MiB
显示代码纯文本
#include<cstdio>
#include<vector>
#define Max(a,b) a>b?a:b
using namespace std;
int n,root,sum,f[20010],t[3],ans,deep[20010],size[20010];
bool vis[20010];
class node
{public:
    int p,w;
}v;
vector<node> d[20010];
int gcd(int x,int y)
{
    return y?gcd(y,x%y):x;
}
void Get_root(int u,int fa)
{
    size[u]=1;
    f[u]=0;
    for(int i=0;i<d[u].size();i++)
    {
        int v=d[u][i].p;
        if(v==fa||vis[v])continue;
        Get_root(v,u);
        size[u]+=size[v];
        f[u]=Max(f[u],size[v]);
    }
    f[u]=Max(f[u],sum-size[u]);
    if(f[u]<f[root])root=u;
}
void Get_deep(int u,int fa)
{
    t[deep[u]]++;
    for(int i=0;i<d[u].size();i++)
    {
        int v=d[u][i].p;
        int w=d[u][i].w;
        if(fa==v||vis[v])continue;
        deep[v]=(deep[u]+w)%3;
        Get_deep(v,u);
    }
}
int Calc(int u,int w)
{
    deep[u]=w;
    t[0]=t[1]=t[2]=0;
    Get_deep(u,0);
    return t[0]*t[0]+t[1]*t[2]*2;
}
void Solve(int u)
{
    vis[u]=1;
    ans+=Calc(u,0);
    for(int i=0;i<d[u].size();i++)
    {
        int v=d[u][i].p;
        int w=d[u][i].w;
        if(vis[v])continue;
        ans-=Calc(v,w);
        sum=size[u];
        root=0;
        Get_root(v,0);
        Solve(root);
    }
}
int lyh()
{
    freopen("cckk.in","r",stdin);
    freopen("cckk.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int a,b;
        scanf("%d%d%d",&a,&b,&v.w);
        v.w%=3;
        v.p=a;
        d[b].push_back(v);
        v.p=b;
        d[a].push_back(v);
    }
    root=0;
    sum=n;
    f[0]=0x7fffffff;
    Get_root(1,0);
    Solve(root);
    n=n*n;
    int g=gcd(n,ans);
    printf("%d/%d\n",ans/g,n/g);
    return 0;
}
int Main=lyh();
int main(){;}