最大網線長度 樹的直徑

2021-10-04 12:45:59 字數 2340 閱讀 8966

實驗室裡原先有一台電腦(編號為1

11),最近小明又為實驗室購置了n−1

n-1n−

1臺電腦,編號為2

22到n

nn。每台電腦都用網線連線到一台先前安裝的電腦上。他希望知道第i

ii臺電腦到其他電腦的最大網線長度,請你幫幫他。

input:

輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n(n

≤10000

)n (n\leq10000)

n(n≤10

000)

,接下來有n−1

n-1n−

1行,每一行兩個數,對於第i

ii行的兩個數,它們表示與i

ii號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過109

10^9

109,每個數之間用乙個空格隔開。

output:

對於每組測試資料輸出n

nn行,第i行表示i號電腦的答案 (1≤

i≤n)

.(1\leq i\leq n).

(1≤i≤n

).

樣例輸入:

511

2131

11

樣例輸出:

323

44

在解決這個題之前我們首先要了解什麼是樹的直徑,樹的直徑為樹中任意兩點之間距離的最大值,要想距離最大,這兩個點必定為葉子。而樹的直徑的求法可以通過任意一點,通過bfs或者dfs找到最遠點,該點一定為樹直徑的乙個端點,然後從該點,繼續遍歷到達最遠點,那麼這樣就找到了樹直徑的另乙個端點。這道題是要求每乙個點到其他點的最長距離,而樹中直徑最長,那麼我們可以求每乙個點到直徑端點的最長距離。由於不知道到哪個直徑端點的距離最長,那麼我們可以從兩個直徑端點分別進行bfs或者dfs,選擇兩者距離中最大的。

對於實現,我們可以先選取任意一點,進行bfs或dfs,找到距離其最遠的點,那麼就得到了樹直徑的乙個端點,然後從該端點進行bfs或dfs,在遍歷的同時記錄到每乙個點的距離,然後取距離最長的點為直徑的另乙個端點,然後再進行一次bfs或者dfs,得到其到每乙個點的距離,那麼每乙個點到任意點的最大距離就是兩個直徑端點到該點的最大距離,故只需要三次遍歷。

對於實現來說,我利用c++中的stl容器vector陣列記錄每乙個點的鄰接點以及與其相連的邊,陣列的下標即為端點,元素為和它鄰接的邊。每一條邊是乙個結構體,有其的乙個端點和邊的權值。我是使用bfs來進行遍歷的,同時使用到了容器中的queue來配合bfs使用。

#include

#include

#include

struct line};

using

namespace std;

intmain()

for(

int i=

2;i1;i++

) queue<

int> q;

q.push(1

);//從頂點1開始遍歷,找直徑端點

vis[1]

=1;while

(!q.

empty()

)//普通bfs}}

int flag=leng[1]

;int zhij=1;

for(

int i=

2;i<=n;i++)}

for(

int i=

1;i<=n;i++

) queue<

int> q1;

q1.push

(zhij)

;//從直徑第乙個端點開始bfs,找到第二個端點,同時將該點到其餘各點的

//距離記錄到leng陣列中

vis[zhij]=1

;while

(!q1.

empty()

)}}int zhij2=1;

int ff=leng[1]

;for

(int i=

2;i<=n;i++)}

int leng2[n+1]

;for

(int i=

1;i<=n;i++

)//從第二個直徑端點開始bfs,將其到每個點的距離儲存到leng2陣列中

queue<

int> q2;

q2.push

(zhij2)

; vis[zhij2]=1

;while

(!q2.

empty()

)}}for

(int i=

1;i<=n;i++)}

}

codeforces 734E 樹的最大直徑

題意 給出乙個樹,每個節點有一種顏色.每次能夠選中乙個節點,其他的點如果到它的路徑上都是這種顏色那麼可以一起改變顏色.問最少需要改變幾次顏色.先按照顏色縮點,然後答案就是縮點之後樹的最大直徑,直接dp即可.include include include include include include...

藍橋杯 大臣的旅費(樹的最大直徑)

問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...

求二叉樹中的最大直徑

leetcode 543.二叉樹的直徑 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。乙個二叉樹的最大直徑 max class solution return math.max math.max diameterofbinary...