……煞笔树形dp看错题调了一年怎么办QAQ
…直接上代码了没什么好说的
码风越来越丑我也很绝望啊【
#include<bits/stdc++.h>
#define MAXN 20005
using namespace std ; int n ;
inline int read() {
register int ch = getchar() ;
while (!isdigit(ch)) ch = getchar() ;
register int rtn = 0 ;
while (isdigit(ch)) rtn = rtn*10 + ch - '0' , ch = getchar() ;
return rtn ;
}
int f[MAXN][3] ;
int T[3] , T1[3] ;
int ans[3] ;
// f[] can be linked up
struct t1 {
int to, nxt, lth ;
t1(){}
t1(int to, int nxt, int lth) : to(to), nxt(nxt), lth(lth) {}
}edge[MAXN<<1] ; int cnt_edge = 0 ;
int fst[MAXN] ;
inline void addedge(int x, int y, int lth) {
edge[++cnt_edge] = t1(y, fst[x], lth) ;
fst[x] = cnt_edge ;
edge[++cnt_edge] = t1(x, fst[y], lth) ;
fst[y] = cnt_edge ;
}
void dfs( int now , int fth ) {
for ( int tmp = fst[now] ; tmp ; tmp = edge[tmp].nxt ) {
int aim = edge[tmp].to ;
if (aim == fth) continue ;
dfs(aim,now) ;
for (int i=0; i^3; ++i) T[ (i+edge[tmp].lth) %3 ] = f[aim][i] ;
for (int i=0; i^3; ++i) f[aim][i] = T[i] ;
T1[0] = T1[1] = T1[2] = 0 ;
for (int i=0; i^3; ++i) {
for (int j=0; j^3; ++j) {
ans[i] += f[aim][j] * f[now][ (i+3-j)%3 ] ;
}
T1[i] += f[aim][i] ;
ans[i] += f[aim][i] ;
}
f[now][0] += T1[0] , f[now][1] += T1[1] , f[now][2] += T1[2] ;
// printf("aim = %d\n",aim) ;
// printf("now = %d\n",now) ;
// printf("%d %d %d\n",f[now][0] , f[now][1] , f[now][2] ) ;
// printf("ans = %d %d %d\n\n",ans[0] , ans[1] , ans[2] ) ;
}
++f[now][0] ;
}
int gcd(int a,int b) { return b ? gcd(b, a%b) : a ; }
int main() {
// freopen("1.in","r",stdin) ;
n = read() ;
for (int i=1; i^n; ++i) {
int x = read() , y = read() , lth = read() % 3 ;
addedge(x,y,lth) ;
}
dfs(1,0) ;
int up = ans[0] , down = ans[0] + ans[1] + ans[2] ;
up = ( up << 1 ) + n , down = ( down << 1 ) + n ;
int dd = gcd(up, down) ;
up /= dd , down /= dd ;
printf("%d/%d\n",up,down) ;
return 0 ;
}