給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。
題目保證有解。
一行表示所求生成樹的邊權和。
v<=50000,e<=100000,所有資料邊權為[1,100]中的正整數。
這是我在ubuntu上寫出的一道題目,一半是vim寫的另一半是sublime寫的
可以想到把全體白邊加上或減去乙個權值來控制最小生成樹中白邊的數量,二分這個權值即可
#include
#include
#include
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define fill(x,t) memset(x,t,sizeof(x))
const
int n=200005;
const
int e=800005;
struct edge e[e];
int fa[n],n,m,mid,ans,need;
int get_father(int x)
bool merge(int x,int y)
bool cmp(edge a,edge b)
}return ret;
}int main(void)
int l=-1000,r=1000;
while (l<=r)
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...