木の直径 - 不登校児童(ロス・バレー)

タイトルを見てください:

クリス自宅の電話が鳴るが、教師クリスの不安の声が来た:「??ねえ、クリスの両親はまだテストを受けたくない、クラスにあなたの子供の任意のない、」受験、クリスと言われました気になる方の両親は、彼らが最短時間でクリスを見つけることにしました。彼らはクリス先生に語った:「ザキングオブファイターズ「過去の経験に基づいて、クリスは友人や家族八代で避けられないShermie隠蔽がプレーを盗み、今ある」ゲームが今、我々は、我々はすぐにあなたを呼び出す、一度見つかった自宅からクリスを見つけるためにオフに設定しました。 。「bangがハングアップしました。

集落と集落のいくつかのストリップを接続するN 2通行が住んでクリス市は、通りをXは、TX分かかります。私は2つの集落と唯一のパスの間のいずれか、保証することができます。C、Shermieと八代は、点Aと点Bに住んでいた時点でのクリスの家 クリスクリスの教師や親は、市内のマップを持っていますが、クリスの両親は、特定の位置点A、B、Cのとクリスの教師のノウハウを知っています。

すぐにクリスのように見つけるためには、クリスの両親は、次の2つの規則を遵守します。

  1. 距離の近くにあれば距離CよりもA B C、クリスの両親はクリスShermieを見つけるために家に行くので、見つからない場合は、クリスの両親八代は帰宅し、その逆も同様です。
  2. クリスの両親は常に2つのポイント間の唯一のパスに沿って歩きます。

もちろん、教師は二つ以上のルールを遵守しますが、彼はA、B、Cの特定の場所を知らなかったので、そして今、彼は最悪の場合クリスには、あなたが彼に言うしたい探しの過程でクリスクリスクリスの両親を知っています両親はクリスを見つけるために多くの時間を過ごすために?

質問の意味はよく理解されています。

 

方法は?

私はその後、私は木の直径と考えることができ、それは個人的なことだと思います。

焦点は、使用方法にありますか?

簡略化タイトル:トピックが意図される:ツリー三点A、Bを見つけるために、そのようなC AC AB +(満たすAC <= BC)の最大値をその

これはそれを行う方法を知っているではありません。

ABは、もはや距離にある木の直径よりも最大の良い、木の明らか直径を、希望しません

次いで、最大ACが、我々はAの各方法を指すことができ、Bは、両方の値が小さい値である方を探している場合、ツリーのDFS径に探し出す価値、(最初ので、より最近になっていますポイント)

最後に、列挙は再び、実際に貪欲な思考で最適な決定(最大)を、追求します

証明、あなたはビューのロス・バレーのポイントに行くことができます。

ここでは、コードの締付プレートがあり、理解しにくいかもしれません。

1の#include <cstdioを>
 2の#include <iostreamの>
 3の#include <アルゴリズム>
 4の#include <CStringの>
 5の#include <cmath>
 6  使用して 名前空間をSTD。
7  CONST  INT MAXN = 500010 8 typedefの長い 長いLL。
9  構造体ノード{
 10      LL から、次の、値に、
11  } B [MAXN]。
12 LL N、M、ヘッド[MAXN]、TOT = 1 13  ボイド追加(LL XX、LL YY、ZZ LL){
 14     B [TOT]。B [TOT] .TO = YY; B [TOT] .next =頭部[XX]、B [TOT] .VALUE = ZZ; = XXヘッド[XX] = TOT ++ 15 }
 16 のLL DIS [MAXN]、DISA [MAXN]、DISB [MAXN]、A、B。
17 LL mostlong、JL = - 0x3f3f3f3f3f3f3f3f、ID = 0 18 ボイドDFS(LL今、LL FA){
 19 のための(iはヘッド[今] =っ;! - i = 1 ; iが= B [i]は.next){
 20          LL U = B [i]は.TOと、LL DA = B [i]は.VALUE。
21 であれば(U == FA)続けます22の          DIS [U] = DIS [今] + ダ。
23 であれば(DIS [U]> JL){
                          24              JL = DIS [U]; ID = U。
25          }
 26          DFS(U、今)。
27      }
 28  }
 29  INT メイン(){
 30      // freopenは( "a.in"、 "R"、標準入力)。
31      のscanf(" %LLD%LLD "、&​​N、&M)。
32      のmemset(ヘッド、 - 1はsizeof (ヘッド))。
33      のために(iは= LL 1、I <= M; I ++ ){
 34          LLのXX、YY、ZZ。
35          のscanf(" %LLD%LLD%LLD "、&​​XX、YY&&グーグー);
36          追加(XX、YY、ZZ);(YY、XX、ZZ​​)を加えます。
37      } DFS(10); A = ID。
38      のmemset(DIS、0はsizeof (DIS))。
39      ID = 0、JL = - 0x3f3f3f3f3f3f3f3f 40      DFS(A、0); B = ID、mostlong = JL。
41      ID = 0、JL = - 0x3f3f3f3f3f3f3f3f 42      のために(LL iは= 1 ; I <= N; I ++)DISAを[I] = DIS [i]は、
43      のmemset(DIS、0はsizeof(DIS)); DFS(B、0 );
44      のために(iは= LL 1、I <= N; I ++)DISB [I] = DIS [i]は、
45      LL ANS = - 0x3f3f3f3f3f3f3f3f 46      のために(iは= LL 1、I <= N; I ++)ANS = MAX(ANS、分(DISA [I]、DISB [I]))。
47      のprintf(" %のLLD \ n "、ANS + mostlong)。
48      リターン 0 ;
49 }
ビット腐っを書きます

概要は、その後、実際には、水を介して、ボードのタイトル曲です。

しかし、ノートが出て努力しています。

1は、長い長い開き、8つの3F無限大の書き込みに割り当てられた:0x3f3f3f3f3f3f3f3fを

オープン配列が2で乗算されなければならない2、双方向側、

注意事項

 

おすすめ

転載: www.cnblogs.com/DZN2004/p/12662081.html