求樹上每個節點可以走到的最遠距離

2022-04-30 23:12:17 字數 3050 閱讀 2087

給定一棵樹,樹中包含 n 個結點(編號1~n)和 n−1 條無向邊,每條邊都有乙個權值。

請你在樹中找到乙個點,使得該點到樹中其他結點的最遠距離最近。

輸入格式

第一行包含整數 n。

接下來 n−1 行,每行包含三個整數 ai,bi,ci,表示點 ai 和 bi 之間存在一條權值為 ci 的邊。

輸出格式

輸出乙個整數,表示所求點到樹中其他結點的最遠距離。

資料範圍

1≤n≤10000,

1≤ai,bi≤n,

1≤ci≤105

輸入樣例:

52 1 1

3 2 1

4 3 1

5 1 1

輸出樣例:

2

第一次dfs求每個節點通過直接點的最遠距離max1以及該兒子,並且還需要求乙個次遠距離max2。然後再求通過父節點可以到達的最遠距離max3,可以是合併父節點的max1或max2或max3,但是當父節點的max1的兒子是該節點時,就不能合併,只能嘗試合併max2,這就是記錄次遠距離的作用

#includeusing namespace std;

const int n=10010;

int head[n],cnt,ans;

struct egedge[n*2];

int max1[n],max2[n],max3[n];

int son1[n];

void addedge(int u,int v,int c);

head[u]=cnt++;

}void dfs1(int u,int pre)

else if(c+max1[v]>max2[u])

}//cout<>n;

memset(head,-1,sizeof head);

for(int i=1,u,v,c;i>u>>v>>c;

addedge(u,v,c);

addedge(v,u,c);

}dfs1(1,0);

dfs2(1,0);

int ans=1000000000;

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

ans=min(ans,max(max1[i],max(max2[i],max3[i])));

cout一所學校前一段時間買了第一台計算機(所以這台計算機的id是1)。

近年來,學校又購買了n-1台新計算機。

每台新計算機都與之前買進的計算機中的一台建立連線。

現在請你求出第i臺計算機到距離其最遠的計算機的電纜長度。

例如,上圖中距離計算機1最遠的是計算機4,因此 s1=3;距離計算機2最遠的是計算機4和5,因此 s2=2;距離計算機3最遠的是計算機5,所以 s3=3;同理,我們也得到 s4=4,s5=4。

輸入格式

輸入包含多測試資料。

每組測試資料第一行包含整數n。

接下來n-1行,每行包含兩個整數,第 i 行的第乙個整數表示第 i 臺電腦**時連線的電腦編號,第二個整數表示這次連線花費的電纜長度。

輸出格式

每組測試資料輸出n行。

第i行輸出第i臺電腦的si。

資料範圍

1≤n≤10000,

電纜總長度不超過109

輸入樣例:

51 1

2 13 1

1 1輸出樣例:32

344帶上邊權

由於最終的答案一定是某個點a被另乙個點b幫助,距離a最遠的點就一定是b,且b點值一定小於a,如果大於a,那麼答案就應該是b點值乘與乙個距離大於等於a的距離,答案就會更大。所以只要找到每個點的可以走到的最遠距離乘再與他的點值像乘法,就能夠找到點a並更新答案

#includeusing namespace std;

const int n=50010;

int fw[n],h[n],tot,max1[n],max2[n],son1[n],p[n];

struct ege[n*2];

void add(int u,int v);

h[u]=tot++;

}void dfs1(int u,int pre)

else if(max1[v]+c>max2[u])

}}void dfs2(int u,int pre)

dfs1(1,0);

dfs2(1,0);

int res=0;

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

cout<

return 0;

}

筆試題 求兔子的最遠距離

給你一組資料,代表柱子的高度,兩隻兔子的起點相同但是起點的位置是任意的,求兩隻兔子的最大距離,最大距離計算方法是k j 1 k,j為下標 兔子只能跳比它所在柱子高的柱子或者高度相同的柱子。兩個兔子至少乙個要跳。上圖為三種情況,起點為假設,但是都保證為最大距離 struct num a 200001 ...

求二叉樹兩節點的最遠距離

題目要求比較簡單,寫一程式求一棵二叉樹中相距最遠的兩個節點之間的距離。其實第一眼就能相當用遞迴是最簡單也是最直觀的 以當前節點v為根的子樹中兩節點的最遠距離有三種情況 1 距離最遠的兩個節點均在v的左子樹 2 距離最遠的兩個節點均在v的右子樹 3 距離最遠的兩個節點乙個在左子樹乙個在右子樹 或者v就...

計算二叉樹的任意兩節點的最遠距離。

利用計算二叉樹高度的方法計算兩個節點最遠距離。計算出乙個節點的深度,左右子樹的深度,然後加起來,就是這個節點的最遠的距離了。然後遍歷二叉樹的所以的節點,找出最大的節點即可。include using namespace std typedef struct btreenode node void c...