戦略的なゲームPOJ - 1463のDFS

 

イタリア+ソリューションいます:

  1  // 。5
   2  // 1
   。3  // 2 1
   。4  // 。3 1
   。5  // 1
   。6  // (i行と呼ぶ)下5行目に第二行目から5点を割り当て、各行2つの数X、Y。それがiとXとの間にエッジがあることを示します。これは、y軸の1辺の長さである
   7  // あなたは離れてすべてのポイントと各ポイントの最大値を見つける必要があります。そして、最終的な出力インチ
  8  // これは私が言うのですか、なぜ木、あることに注意してください。あなただけのn-1のエッジ、及び各点は、少なくとも一つのエッジ有するため、
   9  
10  // ので、他の点からのランダム点x距離からBFSで見つけることができます。ここで、xと、最大距離X1のポイントを見つけ、その後、彼は再び実行するために行ってきましたがBFS
 11  // 離れた最大の点X2から、この点X1から見つけるを。ピットインは再びBFS。彼らはそれからの最大出力を見てみましょう
 12  // 
13  // あなたはその点を見つける最初の時間は確かに最も深いリーフノード×1マップであるため。肯定の全ての点から、最大距離の他のポイントをこのX1を使用する他のリーフノード×2をお探し
 14 // これら2点の間。これら二つの点ための最大深さ
15の#include <stdio.hの>
 16の#include < 文字列 .H>
 17の#include <iostreamの>
 18であるの#include <アルゴリズム>
 19。の#include <キュー>
 20である、 使用 名前空間STD;
 21である CONST  INT MAXN = 20010. ;
 22である INT ; deap1 [MAXN]、VIS [MAXN]、deap2は[MAXN]、N- [MAXN] deap3、CNT、ヘッド[MAXN]
 23であるキュー< INT > R&LT;
 24  構造体のエッジ
 25  {
 26が     INT U、V、次に、W;
 27 } E [MAXN]。
28  ボイドのinit(INT DEAP [MAXN])
 29  {
 30      のためのint型 i = 1 ; iが<= N; ++ I)
 31          DEAP [I] = 0 32  }
 33  空隙 add_edge(int型のx、int型の Y、int型Z)
 34  {
 35      E [CNT] .U =のX。
36      E [CNT] .V = Y。
37      E [CNT] .W = Z。
38      E [CNT] .next = 頭部[X]。
39      頭[X] = CNT ++;
40  }
 41の 空隙 BFS(int型のx、int型DEAP [MAXN])
 42  {
 43      ながら(!r.empty())r.pop();
44の     INIT(VIS)。
45      VIS [X] = 1 46      r.push(X)。
47      ながら(!r.empty())
 48      {
 49          INT U = r.front()。
50          r.pop()。
51          のためにint型 - ;!I = I =ヘッド[U] 1 ; I = E [I] .next)
 52          {
53              INTは V = E [I] .V。
54              であれば(!VIS [V])
 55              {
 56                  VIS [V] = 1 57                  DEAP [V] DEAP [U] + = Eを[I] .W。
58                  r.push(V)。
59              }
 60          }
 61      }
 62  }
 63  のint main()の
 64  {
 65      ながら(〜のscanf(" %d個"、&N))
 66      {
 67          のmemset(頭、 -1はsizeof (ヘッド))。
68          CNT = 0 69          のためにint型 I = 2 ; iが<= N; ++ I)
 70          {
 71              のint X、Yと、
72              のscanf(" %D%dの"、およびX&Y)。
73              add_edge(I、x、y)は、
74              add_edge(X、I、Y)。
75          }
 76          INIT(deap1)。
77の          BFS(1 、deap1)。
78          INT ANS1 = 0、ID1 = -1 ; // printfの( "** \ nを"); 
79          のためにint型 i = 1 ; iが<= N; ++ I)
 80          {
 81の             場合(ANS1 < deap1 [I])
 82              {
 83                  ANS1 = deap1 [I]。
84                  ID1 = I。
85              }
 86          }
 87          INIT(deap2)。
88          であれば(ID1 =! - 1 89          {
 90              BFS(ID1、deap2)。
91          }
 92         ANS1 = 0、ID1 = - 1 93          のためにint型 i = 1 ; iが<= N; ++ I)
 94          {
 95の             場合(ANS1 < deap2 [I])
 96              {
 97                  ANS1 = deap2 [I]。
98                  ID1 = I。
99              }
 100          }
 101          INIT(deap3)。
102          であれば(ID1 =! - 1 103          {
 104の             BFS(ID1、deap3)。
105          }
106          のためには、int型 i = 1 ; iは= N <; ++ I)
 107          {
 108              のprintf(" %Dを\ n " 、MAX(deap1 [i]は、MAX(deap2 [I]、deap3 [I]))) ;
109          }
 110      }
 111      戻り 0 ;
112 }

 

おすすめ

転載: www.cnblogs.com/kongbursi-2292702937/p/11666552.html