bzoj2654 tree(最小生成樹 二分)

2021-08-17 05:13:41 字數 810 閱讀 6688

題目傳送門

碼農伯伯繼續開始新的一季勞作:

題目大意:

有權無向圖,邊分黑、白兩種;要求特定數量的白邊(k條),構成最小生成樹。

解題過程:

1、最樸素的想法:先對白邊排序,然後取k條,再取剩下的黑邊不就好了。(這是錯的!),嘗試一下自己反證。

2、然後看了各種題解,感覺似乎好像理解了:

正解思路:

1、如果對全部邊進行排序,跑最小生成樹,我們可以得到最優的ans,但是白邊不一定是 k 條;

2、如果白邊少了,說明白邊整體權值比較大,所以沒被選中。那我就對邊都減一點權(x),這樣的話,被選中的白邊會增多

同理,如果被選白邊數量大於k,我就給白邊們都減去乙個x。

3、接下來,我們二分這個x,就可以得到(我想要的白邊數量的前提下)的最小生成樹。

注意細節:

1、黑白邊同權的時候,優先選擇白邊。

上**:

#include#includeusing namespace std;

const int mx=100005;

int n,m,k,su,la[mx],f[mx];

struct nodbe[mx],b[mx];

bool cmp(nodb x,nodb y)

int main()

int l=-150,r=150,ans;//邊權最大100,做二分的那個值

while(l<=r)

else r=mid-1;

} printf("%d",ans);

return 0;

}

BZOJ 2654 tree 二分 最小生成樹

給出一些邊,每個邊有乙個邊權和顏色。現在要求出最小邊權有need個白邊的生成樹。輸出這個邊權。在白邊上加乙個權值,這樣就可以人為的改變白邊出現在最小生成樹。這個東西顯然可以二分。之後取一下最小值就可以了。define crt secure no warnings include include in...

bzoj2654 tree 二分 最小生成樹

time limit 30 sec memory limit 512 mb submit status discuss 給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。題目保證有解。第一行v,e,need分別表示點數,邊數和需要的白色邊數。接下來e行,每...

bzoj2654 tree(二分 最小生成樹)

我是超連結 一開始博主想要把黑白邊分開,然後sort,選擇前need小的白邊連起來,然後再連黑邊 但這個貪心是不對的,因為黑邊的大小不確定,如果目前選擇了較小的白邊,可能會選上更大的黑邊 問題的關鍵在於求出的最小生成樹不一定含有need條白邊 1 如果白邊 need條,我們需要 拖累 白邊,讓ta不...