$ Noip2013 / Luogu1967 $運送最大スパニングツリー乗数の$ LCAの$ +

$ Luogu $

 

$ソル$

まず、当然のことながら、その後、最大スパニングツリーを構築するに十分なトラック$更新解答の開始と終了のための$ LCA乗数を実行することです。私は、事前に乗じ$ 2 ^ i個の$ステップはそのポイントになった後にのみ行っておりませ扱うときに覚えていますこのパスの最低重量は、統計的な答えの後に中位てあります。

このタイトルを見つけるために作られたことは、あなたがに問題終え構造上のポイントを選択しないように注意したいときの図は、いくつかの木があるかもしれないことを意味し、China Unicom社は、最大スパニングツリーので、ツリー構造の後に実行されていることを言っていません。それは何が違うとどのように表情がうまくユニコム内のブロックでない場合にツリーが、ただ聞いていないようですので、各ブロックのChina Unicom社は、一度別の場所に構成されています。

 

$コード$

 

#include <ビット/ STDC ++ H>
 に#define ILインライン
 の#define Rgを登録する
 の#define行く(I、B)のための(RG INT I =; iは= bを<; ++ I)
 の#defineはい(I、 I> = B; A、B)のためには、(RGは、INT iが= - I)
 の#define E(I、U)のために(RG INT I = bの[U]; I; iは= [I] .nt )
 の#define MEM)((A、B)のmemset(A、B、はsizeof)
 の#defineが長い長いちゃう
 の#define DB二重
 の#define INF 2147483647を
 使用して 名前空間STDを、
ILのINTのリード()
{ 
    たRG INT X = 0、Y = 1チャー C = GETCHAR()。
    同時に(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();}
     一方、(C> = ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();}
     戻りのx *のY。
} 
のconst  int型 N = 10010 INTの N、M、Q、B [N]、[N]、CT、C [N] [F 11 ]、]、DEP [N]。
BOOL VIS [N]。
構造体ノードは{ int型、例えば[N *; W、VをU}を5 ]。
構造体ノード1 { int型 V、NT、W;} [N * 10 ]。
IL BOOL CMP(ノードX、ノードY){ 戻り XW> YW;} 
ILのint型の検索(INT X){ 場合(X == [X] F)リターン X。戻り F [X] = 見つける([X] F);} 
ILの空隙追加(int型 U、int型 V、INT W){[++ CT] =(ノード1){V、B、W [U]}。 B [U] = CT;} 
ILのボイドDFS(INT U)
{ 
    VIS [U] = 1 
    E(I、U)
    { 
        RgをINT V = [I] .V、W = [I] .W。
        もし(VIS [V])続けます
        DEP [V] = DEP [U] + 1 ; C [v] [ 0 ] = U、D [v] [ 0 ] = W。
        (J、行く110)C [V] [J] = C [V] C [J- 1 ]] [J- 1 ]、D [V] [J] =分(D [v] [J - 1 ]、D [C [v] [J- 1 ]] [J- 1 ])。
        DFS(V); 
    } 
} 
ILINTゾル(INT U、INT V)
{ 
    RgをINT RET = INF。
    もし(DEP [U] < DEP [V])スワップ(U、V)。
    はい(J、100 
    { 
        もし RET =分(保持、D [U] [J])、U =(> DEP [V] DEP [j]をC [U])C [U] [J ]; 
    } 
    もし(DEP [U]> DEP [V])RET =分(保持、D [U] [ 0 ])、U = cで[U] [ 0 ]。
    もし(U == v)のリターンRET; 
    はい(J、100であれば(C [U] [J]!= C [V] [J])RET =分(保持、分(D [U] [J]、D [v]の[J] ))、U = C [U] [j]は、V =C [V] [J]。
    RET =分(RET、分(D [U] [ 0 ]、D [V] [ 0 ]));
    リターンRET; 
} 
int型のmain()
{ 
    N =(読み取り)、M = read()は、
    行く(I、1、N)F [I] = I。
    (I、行く1、M)例えば、[I] = {read()は、(リード)、(読み取り)}(ノード)。
    ソート(例えば + 1、例えば+ M + 1 、CMP)。
    (I、行く1 、M)
    { 
        RgをINT U =例えば、[I] .U、V =例えば、[I] .V、W = 例えば、[I] .W。
        もし(==のfind(V)(U)を見つける。)続けます
        F [(U)を見つける] = (V)を求めます。
        (Uは、V、W)、追加(V、U、W)。
    } 
    行く(I、1、n)の場合(VIS [I]!)DEP [I] = 1 、DFS(I)。
    Q = 読み取り();
    一方、(q-- 
    { 
        RgをINT U =読み取る()、V = 読み取ります();
        場合(見つける(U)=(v)を見つける!)のprintf(" -1です\ n " );
        のprintf(" %d個の\ n "、ゾル(U、V))。// coutの<<てendl; 
    }
     戻り 0 
}
コードの表示

 

 

 

おすすめ

転載: www.cnblogs.com/forward777/p/11416175.html