1 /************************************************************** 2 Problem: 2152 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:500 ms 7 Memory:2612 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #define N 20010 12 13 typedef long long dnt; 14 15 int n; 16 int head[N], dest[N+N], wght[N+N], next[N+N], ntot; 17 int fat[N], vis[N], siz[N], bac[N], dis[N], siz_tot, cur_root; 18 int vv[3], vtot; 19 dnt path_tot, path_ans; 20 21 void insert( int u, int v, int w ) { 22 ntot++; 23 next[ntot] = head[u]; 24 wght[ntot] = w; 25 dest[ntot] = v; 26 head[u] = ntot; 27 } 28 29 void dfs_root( int u ) { 30 siz[u] = 1, bac[u] = 0; 31 for( int t=head[u]; t; t=next[t] ) { 32 int v=dest[t]; 33 if( vis[v] || v==fat[u] ) continue; 34 fat[v] = u; 35 dfs_root(v); 36 siz[u]+=siz[v]; 37 if( siz[v]>bac[u] ) bac[u]=siz[v]; 38 } 39 if( siz_tot-siz[u]>bac[u] ) bac[u]=siz_tot-siz[u]; 40 if( bac[cur_root]>bac[u] ) cur_root=u; 41 } 42 void dfs_read( int u ) { 43 int a = (3-dis[u]%3)%3; 44 path_ans += vv[a]; 45 path_tot += vtot; 46 for( int t=head[u]; t; t=next[t] ) { 47 int v=dest[t], w=wght[t]; 48 if( vis[v] || v==fat[u] ) continue; 49 dis[v]=dis[u]+w; 50 fat[v]=u; 51 dfs_read( v ); 52 } 53 } 54 void dfs_write( int u ) { 55 int a = dis[u]%3; 56 vv[a]++; 57 vtot++; 58 for( int t=head[u]; t; t=next[t] ) { 59 int v=dest[t]; 60 if( vis[v] || v==fat[u] ) continue; 61 dfs_write(v); 62 } 63 } 64 void bfs( int rt ) { 65 siz_tot = siz[rt]; 66 cur_root = 0; 67 fat[rt] = rt; 68 dfs_root(rt); 69 70 rt=cur_root; 71 vis[rt] = true; 72 vv[0] = 1; 73 vtot = 1; 74 for( int t=head[rt]; t; t=next[t] ) { 75 int v=dest[t], w=wght[t]; 76 if( vis[v] ) continue; 77 dis[v] = w; 78 fat[v] = rt; 79 dfs_read(v); 80 dfs_write(v); 81 } 82 vv[0] = vv[1] = vv[2] = 0; 83 vtot = 0; 84 for( int t=head[rt]; t; t=next[t] ) { 85 int v=dest[t]; 86 if( vis[v] ) continue; 87 bfs(v); 88 } 89 } 90 void build_vdcp() { 91 bac[0] = n; 92 siz[1] = n; 93 bfs( 1 ); 94 } 95 dnt gcd( dnt a, dnt b ) { 96 return b ? gcd(b,a%b) : a; 97 } 98 99 int main() { 100 scanf( "%d", &n ); 101 for( int i=1,u,v,w; i<n; i++ ) { 102 scanf( "%d%d%d", &u, &v, &w ); 103 insert( u, v, w ); 104 insert( v, u, w ); 105 } 106 build_vdcp(); 107 path_tot *= 2; 108 path_ans *= 2; 109 path_tot += n; 110 path_ans += n; 111 dnt cd = gcd(path_tot,path_ans); 112 printf( "%lld/%lld ", path_ans/cd, path_tot/cd ); 113 }