Week6作業A 氪金帶東

2021-10-04 12:41:51 字數 1353 閱讀 5699

輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n (n<=10000),接下來有n-1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10^9,每個數之間用乙個空格隔開。

對於每組測試資料輸出n行,第i行表示i號電腦的答案 (1<=i<=n).

511

2131

11

323

44

可將題目中的電腦想象成點,線想象成帶權值的邊(權值為距離),這樣問題便轉化為求加權無向圖中任一點到離它最遠點的距離,而且,由題意可知該圖是一棵樹。

接下來問題是離樹中某一點距離最遠的點如何求,首先,我們來了解樹的直徑的概念,即樹中距離最遠的兩點之間的距離,可證樹中到某一點最遠的點必為樹直徑的兩個端點之一,因此,我們可以反向求取樹的直徑的兩個端點到各點的距離,兩者取最大,即為離各點最遠點的距離值。

因此,我們從隨便乙個點出發進行dfs,找到的最遠點必為端點之一,再從該端點出發進行dfs,同時記錄其到各點的距離,並找到最遠點,為另一端點,再從另一端點出發進行dfs,若該點到某一點的距離大於之前記錄的距離,則對距離值進行更新,經過這三次遍歷之後,我們所記錄的距離,即為各點到最遠點的距離。

#include

#include

#include

using

namespace std;

const

int size=

1e4+

10;

vectorint,

int>> a[size]

;int max[size]

;bool vis[size]

;int far;

void

dfs(

int start,

int length)}}

intmain

(int argc,

char

** ar**));

a[e1]

.push_back()

;}far=1;

dfs(1,

0);memset

(vis,0,

sizeof

(vis));

dfs(far,0)

;memset

(vis,0,

sizeof

(vis));

dfs(far,0)

;for

(int i=

1;i<=n;i++

)printf

("%d\n"

,max[i]);

}return0;

}

Week6 作業 A 氪金帶東

一 題目描述 input 輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n n 10000 接下來有n 1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10 9,每個數之間用乙個空格隔開。output 對於每組測試資料輸...

week6 作業 A 氪金帶東

輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n n 10000 接下來有n 1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10 9,每個數之間用乙個空格隔開。output 對於每組測試資料輸出n行,第i行表示i號電腦...

A 氪金帶東

實驗室裡原先有一台電腦 編號為 1 最近氪金帶師咕咕東又為實驗室購置了 n 1 臺電腦,編號為 2 到 n 每台電腦都用網線連線到一台先前安裝的電腦上。但是咕咕東擔心網速太慢,他希望知道第i臺電腦到其他電腦的最大網線長度,但是可憐的咕咕東在不久前剛剛遭受了宇宙射線的降智打擊,請你幫幫他。輸入要求 輸...