BZOJ 2654 tree 二分答案

2021-07-03 05:58:24 字數 655 閱讀 7913

根據mst演算法的性質,每次選權值最小的邊,所以我們可以給白邊加上或減去乙個權值k

,令白邊被少選或者多選,二分k即可。

ps:機房裡大神突然討論起乙個好像很有道理但實際上並沒用什麼卵用的問題:如果當某乙個權值有很多條白邊和黑邊,如果加上乙個k的時候只選到了need-1條邊,而加上k+1的時候會選到need+1條邊,怎麼辦?   一開始好像覺得這個問題很神,但是突然發現很扯有沒有啊!這個時候白邊和黑邊的權值都相等了,反正又不要輸出方案,考慮這個有個毛線用啊!

#include #include #include using namespace std;

const int n=100005;

struct arrdata[n],a[n];

int n,m,ans,cnt,k,l,r,mid,fa[n],ret;

bool cmp(const arr a , const arr b){

return a.z==b.z ? a.c>1;

memcpy(data,a,sizeof data);

for (int i=1;i<=m;i++)

if (!data[i].c) data[i].z-=mid;

sort(data+1,data+m+1,cmp);

kruskal();

if (cnt

BZOJ2654 tree 生成樹 二分

題目鏈結 給你乙個無向帶權連通圖,每條邊是黑色或白色,求一棵最小權的恰好有 need 條白色邊的生成樹。題目保證有解,輸出最小權值。其中每條邊權在 1,100 範圍內。首先有乙個比較明顯的想法 用kruskal跑出乙個最小生成樹,然後再不斷往其中加邊調整白色邊的數量,用lct維護圈內最大異色邊。好吧...

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行,每...