zoukankan      html  css  js  c++  java
  • 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
    ", path_ans/cd, path_tot/cd );
    113 }
    View Code
  • 相关阅读:
    面试题--十进制转换成2进制
    c++基础--如何将函数作为参数传递
    面试题--完全二叉树的的最后一层的最右节点
    数据库原理--故障恢复
    数据库原理--事务并发控制
    数据库原理--事务(一)
    数据库原理--1nf 2nf 3nf
    数据库原理--外键和主键
    数据库原理--函数依赖和范式
    人人都有极客精神
  • 原文地址:https://www.cnblogs.com/idy002/p/4374242.html
Copyright © 2011-2022 走看看