輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n (n<=10000),接下來有n-1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10^9,每個數之間用乙個空格隔開。output
對於每組測試資料輸出n行,第i行表示i號電腦的答案 (1<=i<=n).
input51
1213
111output32344
本次我用了之前沒用過的鏈式向前星,這是一種用陣列來模擬鍊錶的方法,相對用矩陣和vector陣列,它速度快,節省空間。
乙個結構體陣列edge[i]記錄每條邊的兩個頂點和權值以及next為下條邊的索引。使用陣列head[u]表示以u為頭的第一條邊在結構體陣列中的下標,head 初始化為-1。
每次插入都插入到鍊錶頭部: 新邊edge[i]的next指向當前head[u],head[u]變為新邊的索引。
已知到乙個節點的距離最長的節點一定是這棵樹直徑的兩個端點。所以要找出樹直徑的兩個端點v1、v2,並計算每個點到這兩個點的距離。所以要用三次dfs,第一次dfs從任意一點開始,找到距離最遠的點v1,即為直徑的乙個端點;第二次由v1找到另乙個端點v2,同時在遍歷過程中將v1到各個點的距離儲存在陣列dis2中;第三次由v2開始,在遍歷過程中將v2到各個點的距離儲存在陣列dis3中。max(dis2[i],dis3[i])即為i到其他節點的最大長度。//鏈式向前星
struct edge
;int head[
10010];
int index;
//edge下標
edge edge[
20010];
void
init()
#include
#include
using
namespace std;
struct edge
;int head[
10010
],vis[
10010
],dis1[
10010
],dis2[
10010
],dis3[
10010];
int index,v1,v2,maxlen;
//edge下標
edge edge[
20010];
void
init()
void
add(
int u,
int v,
int w)
intdfs1
(int u)
dfs1
(edge[i]
.v);}}
}int
dfs2
(int u)
dfs2
(edge[i]
.v);}}
}int
dfs3
(int u)}}
intmain()
dfs1(1
);memset
(vis,0,
sizeof
(vis));
maxlen=0;
dfs2
(v1)
;memset
(vis,0,
sizeof
(vis));
dfs3
(v2)
;for
(int i=
1;i<=n;i++)}
return0;
}
Week6作業A 氪金帶東
輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n n 10000 接下來有n 1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10 9,每個數之間用乙個空格隔開。對於每組測試資料輸出n行,第i行表示i號電腦的答案 1 i...
Week6 作業 A 氪金帶東
一 題目描述 input 輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n n 10000 接下來有n 1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10 9,每個數之間用乙個空格隔開。output 對於每組測試資料輸...
A 氪金帶東
實驗室裡原先有一台電腦 編號為 1 最近氪金帶師咕咕東又為實驗室購置了 n 1 臺電腦,編號為 2 到 n 每台電腦都用網線連線到一台先前安裝的電腦上。但是咕咕東擔心網速太慢,他希望知道第i臺電腦到其他電腦的最大網線長度,但是可憐的咕咕東在不久前剛剛遭受了宇宙射線的降智打擊,請你幫幫他。輸入要求 輸...