3425 bzoj:Poi2013偏光

説明

 

誰もがそれだけで時間の問題だろう知っていました。だから何?上の年のために直面​​して、危険は日常の現実になりました。それはその意味を失い...

今日はByteotian王ByteasarにBittard Bitotian文字の手紙が公開されました。Bitotiaはビット分極マグネット(BPM)を使用しての痛みに全体Byteotiaの併合を要求しました。使用している場合、BPMはByteotia単方向にそれぞれ、すべての道になるだろう。敵は、これはミニマリストByteotianインフラに致命的な打撃することができることだけあまりにもよく知っている - 町の各ペア間のユニークな方法があります。

どのようにひどくBPMはByteotianインフラを損傷することができますか?最小値と、まだ新しい道路の向きを観察しながら、他にそれらのいずれかから移動することが可能となります町の、このようなペアの最大数を決定します。

ツリーが与えられると、各側は、この時点までのツリーからパスの図番号にしている、有向グラフのために配向させることができるuは到達点のV (U、V)数。数点までに最大必要な点の最小数

 

 

 

入力

標準入力の最初の行は、単一の整数与える N( 1 <= N <= 250000)、Byteotiaに町の数。 N-1  以降の行は、これらの道路について説明します。このような各ラインは、2つの整数、保持 U   および V(1 <= U <= V <= N) 直接道があることを示し、無町を連結する(まだ現時点では双方向で)。 そして、  

 

 
 

 

出力

 

二つの整数は、標準出力の最初で唯一の行に印刷されなければなりません。(一方向のみが)道路が偏光された後に接続を維持できた町のペアの最大数 - 最初の数が最小と第二であるべきです。

 

 
 
 

サンプル入力

4
1 2
1 3
1 4

サンプル出力


3 5

 

答えがあれば、異なる深さを巻き取ることができる方向を撮影したパリティのプレス側として、最小のn-1でなければなりません。

重心がすべてのサブツリーのルートをポイント、またはすべての離れ根からそれらのそれぞれのどちらかを残して、ルートであるという結論への最大の答えがあります。ルートのサブツリーにポイントのサイズは、xの和であると仮定し、次にサイズの合計から逸脱するルートとするサブツリーは、N-X-1であり、根×(N-X-1)を介してすべての寄与です。

そうするには、今まで作ることができるかを確認するために01のxバックパックを行うために、すべての人の息子の重心を取ることです。直接バックパック圧力レベルは、複雑さが$ Oである(\ FRAC {N ^ 2} {32})$、次いで$ \ GEQ \ SQRT {N} $暴力が行われ、$ \当量の\のSQRT {N}の$バイナリパケットを一緒に行う、複雑さは$ O(\ FRAC {N \のSQRT {N}}、{32})$です。

 

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、  
3  の#defineっ長い長い 
 4  int型 CONST N = 250000 + 10 5  構造体ノード{
 6      INT NTに、。  
7 } E [N << 1 ]。  
8  INT SZ [N]、息子[N]、H [N]、CNT、N、RT、NUM [ 501 ]。 
9  のLL F [N]。   
10ビット集合<N> G。     
11  ボイド追加(int型int型B){
 12     E [++ CNT] .TO = B。  
13      E [CNT] .nt =さH [A]。  
14      時間[A] = CNT。  
15  }   
 16の 空隙 DFS(int型のx、int型FA){
 17      SZ [X] = 1 18      F [X] = 0 19      のためにint型 [X] I = hを、I; I = E [I] .nt){
 20          のint V = E [I] .TO。  
21          であれば(== FA V)続けます22の         DFS(V、X)  
23の          SZ [X] + = SZ [V]。  
24         F [X] + = F [V] + SZ [V]。  
25          であれば(SZ [息子[X] < SZ [V]) 
 26              息子[X] = V。  
27      }  
 28      INT T = MAX(N- SZ [X]、SZ [息子[X]])。  
29      であれば(T <= N / 2)RT = X。   
30  }  
 31  
32  INT メイン(){    
 33      のscanf(" %d個"、&N) 
34      のためにint型 i = 1 ; iがN <; Iは++ ){
 35          、INT X、Yと、  
36         scanf関数(" %dの%のD "、およびX&Y)。  
37          追加(X、Y)  
38          追加(Y、X)。  
39      }
 40の      DFS(10 );  
41の      DFS(RT、0 );    
42      G [ 0 ] = 1 43      のためにint型 [RT] I = hを、I; I = E [I] .nt){
 44          のint V = E [I] .TO。  
45          であれば(SZ [V]> 500 46              G | = G << SZ [V]。 
47            NUM [SZ [V]] ++ ;     
48      }   
 49      int型J、K。   
50      のためには、int型 i = 1 ; iは= < 500 I ++; 51          のための(J = NUM [i]は、K = 1、J、J = = K、K =分(J、K << 1 ))  
 52              gで| = G <<私は* kは、  
53      のためには、int型、I = N / 2 ; I> = 0 ; i-- 54          であれば(G [i])と{
 55              のprintf(" %D%LLD \ N "、N- 1、F [RT] + 1LL * i *が(NI- 1 ))。  
56              ブレーク;  
57          }  
 58      リターン 0 59 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/ZJXXCN/p/11241822.html