輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數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臺電腦到其他電腦的最大網線長度,但是可憐的咕咕東在不久前剛剛遭受了宇宙射線的降智打擊,請你幫幫他。輸入要求 輸...