bzoj 2152

 

  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\n", path_ans/cd, path_tot/cd );
113 }
View Code

 

posted @ 2015-03-28 15:00  idy002  阅读(144)  评论(0编辑  收藏  举报