bzoj2654 二分答案 最小生成樹

2021-08-03 10:38:13 字數 1244 閱讀 2847

2654: tree

time limit: 30 sec memory limit: 512 mb

submit: 1975 solved: 810

[submit][status][discuss]

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 hint

這道題算是一道好題,因為這裡二分的東西雖然不難想,但是思路卻與以前大相徑庭.這道題要構成乙個0邊個數=need的生成樹,又因為要權值最小,所以自然而然的想到了最小生成樹.

每次二分乙個mid就是給0邊權值加上這個mid(最後減去need個mid就可以了)來管控每次最小生成樹錄入的0邊數量,若最小生成樹裡面0邊數量》=need,就返回true;

#include

#include

using

namespace

std;

const

int maxn=100005;

int mid,u[maxn],v[maxn],w[maxn],col[maxn],fa[maxn],tot,cnt,n,m,need,ans;

struct edgee[maxn];

inline

bool cmp(edge a,edge b)

inline

const

int read()

while(ch>='0'&&ch<='9')

return f*x;

}bool check()

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

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

}return cnt>=need;

}int main()

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

}

bzoj2654 二分 最小生成樹

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

bzoj2654 二分 最小生成樹 tree

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

bzoj2654 最小生成樹 二分 tree

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