[Sdoi2011]火災


制限時間:10秒メモリ制限: 512メガバイト
国全体は、n都市、n個の都市のうちのいずれか2つ、ユニークな通信経路が存在する二つ都市ZI(ZI <=の各通信経路の長さを有しています1000)。
この国の人々は炎に宇宙を超えて情熱を持っているので、国の最も盛んな産業は、火災の産業です。政府は忍耐の熱意の国民(火オーバーヘッド費の大多数)の外に走ったが、まだ(大統領選挙は、国民のレートをサポートするために)何もしないように、我々は唯一の消防能力を向上させる方法を試すことができます。
今、この国には、ハブ側の長さsのではなく、パス(両端の都市)よりも上で火を確立するために十分な資金、ハブの利用率を最大化するために、すべての他の都市までの距離が最小のパスの最大値を必要とし。
あなたはプロジェクトを監督するために任命され、もちろんあなたがどの位置にハブを確立するために知っておく必要があります。
入力された
入力のn行:
行1、空白で区切られた2つの正の整数NおよびS、。nは都市の数であり、Sは、境界の経路長です。ノードのこのセットに1,2、...、Nの番号。
二行目からn行目には、正の整数3与えられたスペースで区切られた各ラインは、各エッジの両端点のシーケンス番号と長さを示します。例えば、「247」が7にノード2及び4を接続するエッジの長さを表します。
出力の
出力が選択されたパスへのすべての都市の、すなわち最大の負でない整数を含んで、当然のことながら、全ての番組の最大値が最小でなければなりません。
サンプル入力
[1]サンプル入力
。5 2
1 2 5
2 3 2
2 4 4
2 5 3

サンプル入力[2]
。8. 6
。1 3 2
2 2 3
3 6 4
。4. 3. 5
。4 6 4
4 7 2
7 8 3
サンプル出力

[1]サンプル出力
5
[2]サンプル出力

5
ヒント

100データの%、N <= 300000と、1000は小さい辺の長さに等しいです。

 

/ * 
1を示した:その遠い点から直径上の点は、直径上の点でなければならない
と仮定直径AC 
        E 
B ....... ..... C(提供AB&> BC) 。
		 
		D 
Bを指すように、それから最も遠い点であるべきで
、それがない場合は、しかしDは、(C、B、D)の直径ではなければならない
2を証明する:非直径ため点dは、それから最も遠い点は、直径上の点でなければならない
が、電子ではありません離れDから遠い場合。
デシベル+こと> DB + ABは
これも> ABは、それがeから言うことですBは、遠く離れてよりB、それが逆証明するために始めました。
....... I ......... ........... T L R&LTの
L、エンドポイントについてのR&LT直径、iがT、我々の列挙の点で別の点(点I父親の初期値)
[Tは、i]はlenが所定距離超えない
ように取る、できるだけ小さく、必要に応じて直径方向に選択されていない、選択されたエッジの距離を、
ANS =分(ANS、MAX(D [T]、D [R&LT] -d [I])); 
D距離Lの各点を表す配列。
そのような要求は後に出て来ることができる一般的にツリーので、その最遠点からの全ての点が、それは、直径の両端点のいずれかでなければなりません
 
 
しかし、考慮に入れては、与えられたレンは、ルート全体を覆うことができます。そして、ANS 0を見つけます
だから我々は、他のポイントから決定し、直径に一つ一つを指摘しなければならないことは、その直径ではありません
し、これらの距離の最大値を見つけ、その後、最大ANSを取ります。

* / 
 

の#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
名前空間STDを使用して、
int型FA [310100]、VIS [301000]、最終[301000]においてlen = 0、D [301000]; 
構造体ノード
{ 
    INT ;次に、W、へ
} A [601 000]; 
追加を無効(INT A1、A2はint、int型A3)
{ 
    LEN ++; 
    [LEN] .TO = A2; 
    [LEN] .W = A3; 
    [LEN]。 =最終次に[A1]; 
    最終[A1] = LEN; 
} 
ボイドDFS(INT X)
{ 
    ため(INT I =最終[X]; I; I = A [I] .next)
    { 
        FA [に対する] =のX; 
        int型Aへ= [I ] .TO。
        (VIS [に対する] || FA [X] ==に)場合には引き続き、
    INT、T = R。
        = D [X] + [I] .W [へ] D。
        DFS(へ)。
    } 
} 
int型のmain()
{    
    int型N、S、X、Y、Z、ANS = 2147483647。
    CIN >> N >> S; 
    以下のために(; iがn <I ++はI = 1 INT)
    { 
        scanf関数( "%D%D%D"、およびX&Y、およびZ)を、
        (x、y、z)を加えます。
        (Y、X、Z)を追加します。
    } 
    int型のL = 1、R = 1。
    DFS(L)。
    <;(iは++ = nに対してiはi = 1 INT)
    IF(D [i]とD [L])> 
	    L = I。
    memset(FA、0、はsizeof(FA))。
    D [L] = 0; 
	DFS(L); //算出每个点到L的距离、L是直径的左端点
    用(INT I = 1; I <= N; iは++)
    場合(D [I]> D [R])
	    、R =私; 
    //尺取法(; I iが= FA [i]はi = rは整数)のために
    { 
        ながら(FA [T] && D [I] -d [FA [T] <= S)
		     T = FA [T]を、
        ANS分=(ANS、MAX(D [T]、D [R&LT] -d [I])); 
    } 
    スポット径に//見つけるため(I I = R&LTをint型; I = FA [I])
	    VIS [I] = 1; 
    (; I I = FA [I] I = R&LTをINT)するための
	     D [I] = 0、DFS(I); //ルートの直径上の各点で、非の直径を見つけますそれらの距離のポイント
    のために(; iはi = 1 int型 // iは++; <= n)の最大値を求め、これらの距離の後に見つける
    IF(VIS [I] == 0)
    、ANS = MAX(ANSをD [I]); 
    COUT << ANS; 
}

  

おすすめ

転載: www.cnblogs.com/cutemush/p/11766421.html