時間限制:
10000ms
單點時限:
1000ms
記憶體限制:
256mb
描述上回說到,小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,表示給出的這棵樹中距離最遠的兩個結點之間相隔的距離。
樣例輸入
81 21 3
1 44 5
3 66 7
7 8
樣例輸出
6
這道題和hdu2196簡單一些 求得是樹的最長路
首先假設樹的最長路的兩個葉子節點為v1,v2,那麼現有結論,從任意一點u出發走到的最遠的點一定是(v1,v2)中的一點,然後
再從v1或者v2出發走到的最遠點一定是v2或者v1。所以經過兩次搜尋就能找到最長路徑。
如果想看證明的話 請看我的這篇文章 裡面有對這個結論的證明
ac**:
#include #include #include #include #include using namespace std;
vectortree[100005];
bool vis[100005];
int end_root,max_len;
void dfs(int x,int len)
{ vis[x]=true;
// printf("x=%d len=%d\n",x,len);
if(len>max_len) max_len=len,end_root=x;
for(int i=0;i
hiho 1050 樹中的最長路
題目大意 給出一棵樹,其中每兩個節點都可以形成乙個路徑 要求路徑中的邊只能走一次 求出所有路徑中的長度最大值。分析 由於樹的任何乙個節點均可以作為根節點,因此dfs時候,選擇1即可。實現 pragma once pragma execution character set utf 8 本檔案為utf...
hiho 1050 樹中的最長路 樹的直徑
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述上回說到,小ho得到了一棵二叉樹玩具,這個玩具是由小球和木棍連線起來的,而在拆拼它的過程中,小ho發現他不僅僅可以拼湊成一棵二叉樹!還可以拼湊成一棵多叉樹 好吧,其實就是更為平常的樹而已。但是不管怎麼說,小ho喜愛的玩具又...
hiho 1050 樹中的最長路 樹的直徑
最近在複習比較簡單的知識,順便當整理 吧。樹的直徑是乙個經典問題,即求樹上最遠兩點的距離。思路一 任取乙個點,求這個點的最遠點的最遠點,兩遍bfs即可。1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 in...