bzoj2654 二分 最小生成樹 tree

2021-08-08 04:26:08 字數 1078 閱讀 5192

題目傳送門

description

給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。

題目保證有解。

input

第一行v,e,need分別表示點數,邊數和需要的白色邊數。

接下來e行,每行s,t,c,col表示這邊的端點(點從0開始標號),邊權,顏色(0白色1黑色)。

output

一行表示所求生成樹的邊權和。

v<=50000,e<=100000,所有資料邊權為[1,100]中的正整數。

sample input

2 2 1

0 1 1 1

0 1 2 0

sample output

2題幹說的是求乙個生成樹使他正好包函need條白色邊

以為我們只學過最小生成樹,而最小生成樹中無法限制到底有幾條白色邊

所以,我們把每條白色邊加上乙個mid值,在輸出時減去,這樣我們就可以變向控制生成樹中白色邊的個數

而那個mid值我們可以通過二分來解決

#include 

#include

#include

#include

#include

#include

#define n 100001

#define ll long long

using

namespace

std;

struct ppppa[n];

int n,m,s,f[n],an=0;

bool cmp(pppp x,pppp y)

int dfs(int x)

int main()

int l=-101,r=101,an1=0x7f7f7f7f;

while(l1)

for(int i=1;i<=n;++i)a[i].siz-=mid*a[i].co;

if(ans>=s)else r=mid-1;

}printf("%d",an1);

return

0;}

bzoj2654 二分 最小生成樹

題目戳這裡 我們知道對於乙個最小生成樹而言,它的白邊權值越大,那麼生成樹中的白邊個數越少,反之亦然。所以我們每次二分乙個值,給白邊加上它,在做最小生成樹判斷是否大於所需要的,然後就可以二分來搞了。include include include include define n 100005 usin...

bzoj2654 二分答案 最小生成樹

2654 tree time limit 30 sec memory limit 512 mb submit 1975 solved 810 submit status discuss description 給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成...

bzoj2654 最小生成樹 二分 tree

description 給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。題目保證有解。input 第一行v,e,need分別表示點數,邊數和需要的白色邊數。接下來e行,每行s,t,c,col表示這邊的端點 點從0開始標號 邊權,顏色 0白色1黑色 out...