國家集訓隊2 Tree I 題解

2021-10-05 03:59:56 字數 1404 閱讀 9998

題目傳送門

題目大意:給一張圖,找到一棵恰好包含 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一定...