【問題描述】
給定一棵邊帶權的有根樹,樹中包含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,...