第六章作業 氪金帶東

2021-10-04 17:21:06 字數 1865 閱讀 3104

一、題目二、輸入

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

三、輸出

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

四、樣例輸入輸出

input

5

1 12 1

3 11 1

output

323

44

五、解題思路

圖的遍歷,類似於求樹的直徑。

求i號電腦到其他電腦的最長路徑,可以轉換為總最長路的兩個節點v1、v2到i號電腦的路徑中較長的那個,本題因為無法確定往哪邊走是最長的路徑,所以需要先找到v1,v2,再分別從v1,v2開始遍歷,一共三次遍歷。

通過dfs思想實現遍歷,邊可以使用鄰接表進行儲存,對已經走過的點進行標記處理。通過從v1、v2開始的兩次遍歷記錄v1、v2到i號電腦的距離,二者中取較大的就是i號電腦到其他電腦的最長路徑。

六、**樣例

#include

#include

using

namespace std;

struct edge};

vector e[

10005];

int dis[

10005];

int ans1[

10005];

int ans2[

10005];

void

add(

int u,

int v,

int w)

//後繼插入雙向

void

find

(int u,

int d,

int*dis)

//查詢這個點到其他點的距離

}int n;

intmain()

for(

int i=

0;i<

10005

;i++

)//初始化

int v,w;

for(

int i=

2;i<=n;i++

) dis[1]

=0;//第一次遍歷,隨便找乙個點

find(1

,0,dis)

;/* for(int i=1;i<=n;i++)

cout0,j;

for(

int i=

1;i<=n;i++

)//最遠的點

}// cout;find

(j,0

,ans1)

;/* for(int i=1;i<=n;i++)

coutfor(

int i=

1;i<=n;i++

)//最遠的點 }

ans2[j]=0

;find

(j,0

,ans2)

;/* for(int i=1;i<=n;i++)

cout(int i=

1;i<=n;i++

)for

(int i=

1;i<=n;i++

) cout<<}return0;

}

第六章作業

例題6.1 舉例說明了指標的幾種表示形式,p指向指標指向的變數,p指向該變數的儲存位址,例題6.1 指標的幾種形式 自動化1121 李慶典 include 預編譯處理命令 using namespace std 標準名字空間 int main q 0 cout string1 is cout 例題6...

第六章作業

6.12 要求 1 建立基類area cl的兩個派生類rectangle與isosceles,讓每乙個派生類都包含乙個函式area 分別用來返回矩形與三角形的面積。用建構函式對height與width進行初始化。2 寫出主程式,用來求height與width分別為10.0與5.0的矩形面積,以及求h...

作業第六章

一簡答題 1.說明在迴圈結構中break和continue語句的區別。答 break語句 用於終止某個迴圈,程式跳轉到迴圈體外的下一條語句。continue語句 用於跳出本次迴圈,進入下一次迴圈。2.使用for迴圈結構實現 從鍵盤上輸入接收從周一到周五每天學習時間 以小時為單位 並計算每日平均學習時...