題目傳送門
題目大意:給一張圖,找到一棵恰好包含 k
kk 條白邊的最小權值生成樹。
這是 wqs
wqswq
s 二分的一道很入門的題。
設 g (i
)g(i)
g(i)
表示包含恰好 i
ii 條白邊的生成樹中權值最小的那棵樹的權值。顯然 g(i
)g(i)
g(i)
是個下凸包,那麼我們二分乙個斜率 k
kk,然後每次讓所有白邊的權值加上這個 k
kk 然後跑一次最小生成樹,然後根據其中包含的白邊數量調整 l,r
l,rl,
r 即可。假如將 l
ll 調整到 mid
midmi
d,那麼白邊的權值都會變大,從而最小生成樹中的白邊數量就會減少,調整 r
rr 則反之。
在這題中,讓白邊加上乙個 k
kk 你可以理解為調整白邊相對黑邊被選到的概率
。
具體還有些細節就看**吧:
#include
#include
using
namespace std;
#define maxn 100010
#define eps 1e-10
int n,m,need;
struct edge
;edge e[maxn]
;double l=
-100.0
,r=100.0
;struct par};
bool
cmp(edge x,edge y)
int f[maxn]
;int
findfa
(int
&x)par check
(double x)
for(
int i=
1;i<=m;i++)if
(!e[i]
.col)e[i]
.z-=x;
return re;
}int
main()
;double ans=
0;par p;
while
(r-l>eps)
//有些題目如果是二分到小數級別會tle,就只能在整數域上二分
//如果只在整數域上二分那麼check函式中需要稍作調整,比如這題就要在權值相同時優先選擇白邊
else
if(p.wh//錯誤示範
/* if((p=check(mid)).wh==need)
else if(p.wh}
printf
("%.0lf"
,ans)
;}
國家集訓隊2 Tree I
給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。題目保證有解。好像有個套路 對於有個數要求的某種邊,可以改變它們的權值,以改變它們加入最小生成樹的順序 包括移出最小生成樹 改變量可以二分。因為改變量 包括符號 越大,加入的邊就越少。細節 include ...
P2619 國家集訓隊2 Tree I
新增鏈結描述 二分題,考慮kruskal的過程,讓白邊變成need條,權值定了的時候,最小生成樹是定的,如果現在白邊的數量大於need條,那麼我們需要整體增加白邊的權值,相當於讓白邊減少,如果多的話相反。至於增加多少,需要二分去判定。這道題細節挺多的,比如可能有權值 mid會導致白邊多了,權值 mi...
P2619 國家集訓隊2 Tree I
鏈結分析 為了確定白邊選入的數量,所以給白邊加乙個權值,二分這個值,然後最小生成樹。可以發現白邊的數量雖這個值的增大而減小,滿足單調性。有乙個問題 如果在二分過程中給白邊加上mid,白邊數比need多,加mid 1,白邊數need少。即存在很多相等的白邊 和 很多相等的黑邊。如果白邊大於need一定...