zoukankan      html  css  js  c++  java
  • 聪聪可可

    对于每个点,统计过他的边的对三取模的个数。看代码。

    #include<bits/stdc++.h>
    using namespace std;
    #define inf 1e9
    const int maxn=20005;
    int beg[maxn],nex[maxn*2],to[maxn*2],w[maxn*2],e;
    inline void add(int x,int y,int z){
        e++;nex[e]=beg[x];
        beg[x]=e;to[e]=y;w[e]=z;
    }
    inline int read(){
        int x=0,f=1;
        char c=getchar();
        while(c>'9'||c<'0'){
            if(c=='-')f=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9'){
            x=(x<<1)+(x<<3)+c-'0';
            c=getchar();
        }
        return x*f;
    }
    int n,mx,rt,size,ans;
    int sz[maxn],son[maxn];
    int vis[maxn],tmp[5],dp[maxn][5];
    inline void getrt(int x,int fa){
        sz[x]=1;son[x]=0;
        for(int i=beg[x];i;i=nex[i]){
            int t=to[i];
            if(t==fa||vis[t])continue;
            getrt(t,x);
            sz[x]+=sz[t];
            if(sz[t]>son[x])son[x]=sz[t];
        }
        if(son[x]<size-sz[x])son[x]=size-sz[x];
        if(son[x]<mx)mx=son[x],rt=x;
    }
    
    inline void calc(int x,int fa,int val){
        tmp[val%3]++;
        for(int i=beg[x];i;i=nex[i]){
            int t=to[i];
            if(t==fa||vis[t])continue;
            calc(t,x,w[i]+val);
        }
    }
    inline void divide(int x){
        vis[x]=1;
        int tp[5];
        tp[0]=tp[1]=tp[2]=0;
        for(int i=beg[x];i;i=nex[i]){
            int t=to[i];
            if(vis[t])continue;
            tmp[0]=tmp[1]=tmp[2]=0;
            calc(t,x,w[i]);
            dp[x][0]=dp[x][0]+2*tmp[0]+2*tmp[0]*tp[0]+2*tmp[1]*tp[2]+2*tmp[2]*tp[1];
            dp[x][1]=dp[x][1]+2*tmp[1]+2*tmp[0]*tp[1]+2*tmp[1]*tp[0]+2*tmp[2]*tp[2];
            dp[x][2]=dp[x][2]+2*tmp[2]+2*tmp[0]*tp[2]+2*tmp[1]*tp[1]+2*tmp[2]*tp[0];
            tp[0]+=tmp[0],tp[1]+=tmp[1],tp[2]+=tmp[2];
            mx=inf,rt=0,size=sz[t];
            getrt(t,x);
            divide(rt);
        }
        dp[x][0]++;
        ans+=dp[x][0];
        //printf("%d %d
    ",x,dp[x][0]);
    }
    inline int gcd(int x,int y){
        if(y==0)return x;
        return gcd(y,x%y);
    }
    int main(){
        cin>>n;
        int x,y,z;
        for(int i=1;i<n;i++){
            x=read(),y=read(),z=read();
            add(x,y,z);add(y,x,z);
        }
        mx=inf,rt=0,size=n;
        getrt(1,0);
        divide(rt);
        int t=gcd(ans,n*n);
        printf("%d/%d
    ",ans/t,n*n/t);
        return 0;
    }

    很板子的一道题哈!

  • 相关阅读:
    CRM 线索 客户 统称为 资源 客户服务管理篇 销售易
    IM 简介
    蚂蚁区块链
    区块链存证
    TQ2440 LCD试验失败经验教训
    调色板的概念
    分离链接散列表C语言实现实例
    Nor Flash启动和Nand Flash启动时Stepping stone都在哪?
    ADS中编译现存项目时常见错误:无法打开文件……2440init.o的解决办法
    TQ2440之定时器中断0——volatile关键字的重要作用
  • 原文地址:https://www.cnblogs.com/syzf2222/p/12386749.html
Copyright © 2011-2022 走看看