TLE求助
全T,感觉很奇怪,但是找不出错误
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+10;
typedef long long ll;
int n,cnt,head[N],vis[N],sum;
struct edge{
int to,w,nxt;
}e[N*2];
void add(int u,int v,int w){
e[++cnt]=(edge){v,w,head[u]};
head[u]=cnt;
}
int sz[N],mx[N];
void chkmax(int &a,int b){a>b?(a=a):(a=b);}
void getG(int x,int fa,int &rt){
sz[x]=1;mx[x]=0;
for (int i=head[x];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa||vis[v] ) continue;
getG(v,x,rt);
sz[x]+=sz[v];
chkmax(mx[x],sz[v]);
}
chkmax(mx[x],sum-sz[x]);
if(mx[x]<mx[rt]) rt=x;
}
int ans,d[N],t[N];
int getdeep(int u,int fa){
t[d[u]]++;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa||vis[v]) continue;
d[v]=(d[u]+e[i].w)%3;
getdeep(v,u);
}
}
int calc(int u,int len){
t[0]=t[1]=t[2]=0;
d[u]=len;
getdeep(u,0);
return t[1]*t[2]*2+t[0]*t[0];
}
void slove(int u){
ans+=calc(u,0);
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(vis[v]) continue;
ans-=calc(v,e[i].w);
int G=0;
mx[0]=n,sum=sz[v];
getG(v,u,G);
slove(G);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y,z; scanf("%d%d%d",&x,&y,&z);
z%=3;add(x,y,z);add(y,x,z);
}
int rt=1;mx[0]=sum=n;getG(1,0,rt);
slove(rt);
int Gcd=__gcd(ans,n*n);
printf("%d/%d",ans/Gcd,n*n/Gcd);
return 0;
}