題目傳送門
碼農伯伯繼續開始新的一季勞作:
題目大意:
有權無向圖,邊分黑、白兩種;要求特定數量的白邊(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不...