タイトル1536:ツリーの最小高さツリーの直径(パーソナルクラシックコード)
7019 ワード
タイトル1536:木の最小高さ
時間制限:5秒
メモリ制限:128メガ
タイトルの説明:
無方向ツリーを指定すると、ルートノードとして異なるノードを選択すると、異なる高さ(すなわち、ルートノードからリーフノードまでの距離の最大値)が得られ、このツリーの可能な最低高さが求められます.
入力:
入力には、複数のテストケースが含まれる場合があります.各テストケースについて、入力された第1の動作は整数n(1<=n<=1000000)である.次のn−1行に続き、各行は2つの整数uを含み、v(0<=u、v
出力:
各テストケースに対応して、このツリーの可能な最小高さを出力します.
サンプル入力:
サンプル出力:
時間制限:5秒
メモリ制限:128メガ
タイトルの説明:
無方向ツリーを指定すると、ルートノードとして異なるノードを選択すると、異なる高さ(すなわち、ルートノードからリーフノードまでの距離の最大値)が得られ、このツリーの可能な最低高さが求められます.
入力:
入力には、複数のテストケースが含まれる場合があります.各テストケースについて、入力された第1の動作は整数n(1<=n<=1000000)である.次のn−1行に続き、各行は2つの整数uを含み、v(0<=u、v
出力:
各テストケースに対応して、このツリーの可能な最小高さを出力します.
サンプル入力:
3
0 1
1 2
5
0 1
1 2
1 3
1 4
サンプル出力:
1
1
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <fstream>
#include <vector>
#define Min(a,b) ((a)<(b)?(a):(b))
#pragma comment(linker, "/STACK:16777216")
using namespace std ;
typedef long long LL ;
const int size=1000008 ;
struct Edge{
int v ;
int next ;
};
Edge edge[size*2] ;
int vec[size] ,dist[size];
int id ,N;
bool visited[size] ;
inline void add_edge(int u ,int v){
edge[id].v=v ;
edge[id].next=vec[u] ;
vec[u]=id++ ;
}
void init(){
id=0 ;
fill(vec,vec+N,-1) ;
fill(dist,dist+N,0) ;
fill(visited,visited+N,0) ;
}
void dfs(int father,int high){
visited[father]=1 ;
dist[father]=high ;
for(int e=vec[father];e!=-1;e=edge[e].next){
int son=edge[e].v ;
if(visited[son])
continue ;
dfs(son,high+1) ;
}
}
int gao(){
init() ;
int u ,v ;
for(int i=1;i<N;i++){
scanf("%d%d",&u,&v) ;
add_edge(u,v) ;
add_edge(v,u) ;
}
dfs(0,0) ;
int start=max_element(dist,dist+N)-dist ;
//printf("%d
",start) ;
fill(dist,dist+N,0) ;
fill(visited,visited+N,0) ;
dfs(start,0) ;
int Height=*max_element(dist,dist+N) ;
if(Height&1)
return Height/2 +1 ;
else
return Height/2 ;
}
int main(){
while(scanf("%d",&N)!=EOF){
printf("%d
",gao()) ;
}
return 0 ;
}