bzoj2654 tree(二分 最小生成樹)

2021-08-13 19:25:24 字數 863 閱讀 9766

題目傳送門

神題。解法:

想了我乙個小時就是想不出來怎麼做。

上來看看硬做行不行好像不行。

想了想二分邊權和。

還是不行。。

想了很久怎麼做。想不出來。

%題解!!

哇神方法。

當所有白色的邊都加上乙個東西的時候。

那麼對於最後的方案白色的邊因為權大了所以勢必要減少。

當所有白色的邊都減去乙個東西的時候。、

那麼對於最後的方案白色的邊因為權小了所以勢必要增多。

所以就二分這個東西呀。

然後去跑最小生成樹。

跑出來的結果如果白色邊的條數》=need說明白色的多了。

那麼我們讓他的數目減少一點,那麼增加的權就應該多一點。

所以往大的二分。

如果白色邊的條數

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct node a[110000];int len;

bool cmp(node n1,node n2)

int main()

while(l<=r)

}for(int i=1;i<=m;i++)if(a[i].t==0)a[i].c-=mid;

if(k>=k)

else r=mid-1;

}printf("%d\n",ans);

return

0;}

BZOJ 2654 tree 二分答案

根據mst演算法的性質,每次選權值最小的邊,所以我們可以給白邊加上或減去乙個權值k 令白邊被少選或者多選,二分k即可。ps 機房裡大神突然討論起乙個好像很有道理但實際上並沒用什麼卵用的問題 如果當某乙個權值有很多條白邊和黑邊,如果加上乙個k的時候只選到了need 1條邊,而加上k 1的時候會選到ne...

BZOJ2654 tree 生成樹 二分

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

BZOJ 2654 tree 二分 最小生成樹

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