樹中的最長路
描述
上回說到,小Ho得到了一棵二叉樹玩具,這個玩具是由小球和木棍連接起來的,而在拆拼它的過程中,小Ho發現他不僅僅可以拼湊成一棵二叉樹!還可以拼湊成一棵多叉樹——好吧,其實就是更爲平常的樹而已。
但是不管怎麼說,小Ho喜愛的玩具又升級換代了,於是他更加愛不釋手(其實說起來小球和木棍有什麼好玩的是吧= =)。小Ho手中的這棵玩具樹現在由N個小球和N-1根木棍拼湊而成,這N個小球都被小Ho標上了不同的數字,並且這些數字都是出於1..N的範圍之內,每根木棍都連接着兩個不同的小球,並且保證任意兩個小球間都不存在兩條不同的路徑可以互相到達。總而言之,是一個相當好玩的玩具啦!
但是小Hi瞧見小Ho這個樣子,覺得他這樣沉迷其中並不是一件好事,於是尋思着再找點問題讓他來思考思考——不過以小Hi的水準,自然是手到擒來啦!
於是這天食過早飯後,小Hi便對着又拿着樹玩具玩的不亦樂乎的小Ho道:“你說你天天玩這個東西,我就問你一個問題,看看你可否知道?”
“不好!”小Ho想都不想的拒絕了。
“那你就繼續玩吧,一會回國的時候我不叫上你了~”小Hi嚴肅道。
“誒!別別別,你說你說,我聽着呢。”一向習慣於開啓跟隨模式的小Ho忍不住了,馬上喊道。
小Hi滿意的點了點頭,隨即說道:“這纔對嘛,我的問題很簡單,就是——你這棵樹中哪兩個結點之間的距離最長?當然,這裏的距離是指從一個結點走到另一個結點經過的木棍數。”。
“啊?”小Ho低頭看了看手裏的玩具樹,困惑了。
提示一:路總有折點,路徑也不例外!輸入
每個測試點(輸入文件)有且僅有一組測試數據。
每組測試數據的第一行爲一個整數N,意義如前文所述。
每組測試數據的第2~N行,每行分別描述一根木棍,其中第i+1行爲兩個整數Ai,Bi,表示第i根木棍連接的兩個小球的編號。
對於20%的數據,滿足N<=10。
對於50%的數據,滿足N<=10^3。
對於100%的數據,滿足N<=10^5,1<=Ai<=N, 1<=Bi<=N
小Hi的Tip:那些用數組存儲樹邊的記得要開兩倍大小哦!
輸出
對於每組測試數據,輸出一個整數Ans,表示給出的這棵樹中距離最遠的兩個結點之間相隔的距離。
8 1 2 1 3 1 4 4 5 3 6 6 7 7 8樣例輸出
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#define INF 0x7fffffff
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
struct Edge
{
int v, next;
} e[N*2];
int head[N], tot, ans;
void add_edge(int u,int v)
{
e[tot].v = v;
e[tot].next = head[u];
head[u] = tot++;
}
int dfs(int st, int pre)
{
int first = 0, second = 0;
for(int i = head[st]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(v == pre) continue ;
int d = dfs(v, st) + 1;
if(d > first)
{
second = first;
first = d;
}
else if(d > second)
{
second = d;
}
}
if(first + second > ans)
{
ans = first + second;
}
return first;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
tot = 0;
ans = 0;
memset(head, -1, sizeof(head));
for(int i = 0; i < n-1; i++)
{
int x, y;
scanf("%d%d",&x, &y);
add_edge(x-1,y-1);
add_edge(y-1,x-1);
}
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}