訓練題 小樹 計算樹上各點的深度和到根的距離

2021-07-24 06:45:56 字數 1363 閱讀 7427

【問題描述】

給定一棵邊帶權的有根樹,樹中包含n個結點(編號為0..n-1),其中根結點的編號為0。你的任務是在樹中找出乙個結點集合,集合需要滿足如下三個條件:

1)、根結點不在集合中,即0 < ai < n (1 ≤ i ≤ m);

2)、集合中任意兩個結點的最近公共祖先一定是根結點;

3)、設 wi 為結點 ai 到根的路徑上包含的邊的權值和,di 為結點 ai 到根的路徑上包含的邊的數目,那麼集合中的 ∑wi/∑di 要達到最大(1 ≤ i ≤ m)。

【輸入格式】

第1行為整數n,表示樹的結點數量,接下來的n-1行,每行包含3個整數:u,v,c,表示一條有向邊的起點為u,終點為v,邊的權值為c。

【輸出格式】

對於每組資料輸出一行,為乙個實數,表示最大的∑wi/∑di,四捨五入保留2位小數。

【輸入樣例】

【樣例1】

2

0 1 2

【樣例2】

3

0 1 1

0 2 2

【輸出樣例】

【樣例1】

2.00
【樣例2】

2.00
【資料範圍】

1 ≤ n ≤ 1000

【**】

中山大學2023年集訓隊內部選拔賽

思路:

最開始看到題目以為是0/1分數規劃。後來看到了lebmond發的題解——cpp環境【中山大學2023年集訓隊內部選拔賽】【cqyzoj1595】小樹,可以證明的是:只選乙個點是最優解或者最優解之一。

假設存在多個點使得他們的∑wi/∑di是所有解中最大的。為了便於理解,不妨假設存在兩個點。那麼一定就是說這兩個點1.如果兩個節點的

2.如果兩個節點的

**如下:

#include

#include

#include

#include

#define maxn 1005

using

namespace

std;

int n,dist[maxn],dep[maxn];

vector

g[maxn],w[maxn];

double ans=0;

bool inq[maxn];

void bfs(int s)

}}void solve()

int main()

solve();

return

0;}

樹上的好題

給出乙個n個節點的有根樹 編號為0到n 1,根節點為0 乙個點的深度定義為這個節點到根的距離 1。設dep i 表示點i的深度,lca i,j 表示i與j的最近公共祖先。有q次詢問,每次詢問給出l r z,求sigma dep lca i,z 即,求在 l,r 區間內的每個節點i與z的最近公共祖先的...

構造題訓練

由於noip之前沒有怎麼做過構造,導致吃了大虧。構造 互動 基本問題 有一些數,假設有 n 個,有 m 個被標記,我們可以詢問乙個集合。我們可以得知這個集合內是否存在被標記的數。要求次數 o m log 2n 做法1 分治 考慮分治到當前區間 l,r 詢問 l,r 有沒有被標記的數。如果沒有,則返回...

CTSC模擬題 樹上的路徑

給定一棵 n 個結點的樹,結點用正整數 1 dots n 編號,每條邊有乙個正整數權值。用 d a,b 表示從結點 a 到結點 b 路徑上經過邊的權值和,其中要求 a b 將這 frac 個距離值從大到小排序,輸出前 m 個距離值。第一行包含兩個正整數 n,m 下面 n 1 行,每行三個正整數 a,...