hiho 1050 樹中的最長路

2021-07-11 13:33:48 字數 1804 閱讀 2375

時間限制:

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,表示給出的這棵樹中距離最遠的兩個結點之間相隔的距離。

樣例輸入

8

1 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...