1021 Deepest Root (25 分)

接続及び非環式のグラフはツリーと考えることができます。木の高さは、選択したルートに依存します。今、あなたは最高の木につながるルートを見つけることになっています。このようなルートは、最も深い根と呼ばれています。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は整数正含ま  N(ノードの数であり、したがってノードは1から番号が付けられている≤)  次にN.  N - 1行が続くが、それぞれが与えられた2つの隣接ノードによってエッジを記述する「数字。

出力仕様:

各テストケースのために、ラインの最も深い根のそれぞれを印刷します。そのようなルートが一意でない場合は、その番号の昇順でそれらを印刷します。与えられたグラフがツリーでない場合に、印刷  Error: K components 場所  K グラフにおける連結成分の数です。

サンプル入力1:

5
1 2
1 3
1 4
2 5

サンプル出力1:

3
4
5

サンプル入力2:

5
1 3
1 4
2 5
3 4

出力例2:

Error: 2 components

トピック分析:最初の私に連結グラフのために私は思うの質問の意味を誤解しますが、実際には何のループがありません 

そこ回路が切断されなければなりません 

また、遠大な効果ベクトル<ベクトル<int型>>を持っていたことは、メモリ空間の配列を使用するノートが優れています

1  の#define _CRT_SECURE_NO_WARNINGS
 2の#include <iostreamの>
 3の#include <ベクトル>
 4の#include <キュー>
 5の#include <積層体>
 6の#include <アルゴリズム>
 7  使用して 名前空間をSTD。
8  INT =最高- 1 9ベクトル<ベクトル< 整数 >> G。
10  INTディスト[ 10001 ]。
11  INT収集[ 10001 ]。
12  int型N。
13の INT成分= 1;
14ベクター< INT > V。
15の ボイド DFS(int型V)
 16  {
 17      [V] =収集1 18      のためにINT iは= 0 ; iは<G [V] .size(); I ++ 19      {
 20          であれば(!収集[G [V] [I])
 21          {
 22              ディスト[G [V] [I] ] =ディスト[V] + 1 23の             DFS(G [V] [I])。
24          }
 25      }
 26  }
 27 INT main()の
 28  {
 29      CIN >> N。
30      G.resize(N + 1 )。
31      のためにINT iが= 1 ; I <Nであり; I ++ 32      {
 33          のint V1、V2は、
34          CIN >> V1 >> V2。
35          G [V1] .push_back(V2)。
36          G [V2] .push_back(V1)。
37      }
 38      のint i = 1 39      のために(; I <= N; iは++ 40      {
 41         フィル(ディスト、ディスト+ N + 10 );
42          充填(+ N +収集し、収集され10 );
43の         DFS(I)。
44          のためにINT J = 1 ; J <= N; J ++ 45          {
 46              であれば(!収集[J])
 47              {
 48                  DFS(J)。
49の                  コンポーネント++ ;
50              }
 51          }
 52          であれば(コンポーネント!= 1 53              ブレーク;
54          INTマックス= - 65535 ;
55          のためにINTは iは= 1 ; I <= N I ++ 56              であれば(最大< ディストリ[I])
 57                  マックス= ディストリ[I]。
58          であれば(最大> 最高)
 59          {
 60              最高= マックス。
61              V.clear()。
62              V.push_back(I)。
63          }
 64          他の 場合(最大== 最高)
 65             V.push_back(I);
66      }
 67      であれば(コンポーネント== 1 68      {
 69          のためにINTは iは= 0 ; I <V.size() - 1 ; I ++ 70              のprintf(" %D \ n " 、V [I])。
71          のprintf(" %dの"、V [V.size() - 1 ])。
72      }
 73      他の
74          のprintf(" エラー:%d個のコンポーネント" 、コンポーネント)。
75     リターン 0 ;
76 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/57one/p/11930404.html