week6 作業 A 氪金帶東

2021-10-04 16:38:42 字數 1921 閱讀 8619

輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數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]變為新邊的索引。

//鏈式向前星

struct edge

;int head[

10010];

int index;

//edge下標

edge edge[

20010];

void

init()

已知到乙個節點的距離最長的節點一定是這棵樹直徑的兩個端點。所以要找出樹直徑的兩個端點v1、v2,並計算每個點到這兩個點的距離。所以要用三次dfs,第一次dfs從任意一點開始,找到距離最遠的點v1,即為直徑的乙個端點;第二次由v1找到另乙個端點v2,同時在遍歷過程中將v1到各個點的距離儲存在陣列dis2中;第三次由v2開始,在遍歷過程中將v2到各個點的距離儲存在陣列dis3中。max(dis2[i],dis3[i])即為i到其他節點的最大長度。

#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臺電腦到其他電腦的最大網線長度,但是可憐的咕咕東在不久前剛剛遭受了宇宙射線的降智打擊,請你幫幫他。輸入要求 輸...