Title Address: Bzoj 2152
Find out how many pairs of weights and points are multiples of 3. The simplest point division of the rule.
The code is as follows:
#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#include <time.h>using namespace STD;#define LL __int64#define PI ACOs ( -1.0)//#pragma comment (linker, "/stack:1024000000")Const intMod=1e9+7;Const intinf=0x3f3f3f3f;Const Doubleeqs=1e-9;Const intmaxn=20000+Ten;intHEAD[MAXN], CNT, root, ans, min1;intSIZ[MAXN], ha[4], DEP[MAXN], VIS[MAXN];structnode{intV, W, next;} edge[maxn<<1];voidAddintUintVintW) {edge[cnt].v=v; Edge[cnt].w=w; Edge[cnt].next=head[u]; head[u]=cnt++;}voidInit () {memset(head,-1,sizeof(head)); cnt=ans=0;memset(Vis,0,sizeof(VIS));}voidGetroot (intUintFaints) {siz[u]=1;intI, max1=0; for(i=head[u];i!=-1; i=edge[i].next) {intV=EDGE[I].V;if(v==fa| | VIS[V])Continue; Getroot (v,u,s); SIZ[U]+=SIZ[V]; Max1=max (Max1,siz[v]); } max1=max (Max1,s-siz[u]);if(MIN1>MAX1) {root=u; MIN1=MAX1; }}voidGETDEP (intUintFA) {ha[dep[u]%3]++; siz[u]=1; for(inti=head[u];i!=-1; i=edge[i].next) {intV=EDGE[I].V;if(v==fa| | VIS[V])Continue; DEP[V]=DEP[U]+EDGE[I].W; GETDEP (V,u); SIZ[U]+=SIZ[V]; }}intCal (intUintLen) {Dep[u]=len; ha[0]=ha[1]=ha[2]=0; GETDEP (u,-1);returnha[0]*ha[0]+ha[1]*ha[2]*2;}voidWorkintu) {vis[u]=1; Ans+=cal (U,0); for(inti=head[u];i!=-1; i=edge[i].next) {intV=EDGE[I].V;if(Vis[v])Continue; Ans-=cal (V,EDGE[I].W); Min1=inf; Getroot (v,-1, Siz[v]); Work (root); }}intgcdintXintY) {returnx==0? Y:GCD (y%x,x);}intMain () {intN, u, V, W, I, J, _GCD; while(scanf("%d", &n)!=eof) {init (); for(i=1; i<n;i++) {scanf("%d%d%d", &u,&v,&w); Add (u,v,w%3); Add (v,u,w%3); } Min1=inf; Getroot (1,-1, n); Work (root); _GCD=GCD (Ans,n*n);printf("%d/%d\n", ANS/_GCD,N*N/_GCD); }return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Bzoj 2152 Cong Cocoa (Point Division on tree)