給定一棵樹,樹中包含 n 個結點(編號1~n)和 n−1 條無向邊,每條邊都有乙個權值。第一次dfs求每個節點通過直接點的最遠距離max1以及該兒子,並且還需要求乙個次遠距離max2。然後再求通過父節點可以到達的最遠距離max3,可以是合併父節點的max1或max2或max3,但是當父節點的max1的兒子是該節點時,就不能合併,只能嘗試合併max2,這就是記錄次遠距離的作用請你在樹中找到乙個點,使得該點到樹中其他結點的最遠距離最近。
輸入格式
第一行包含整數 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
#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...