time limit: 30 sec
memory limit: 512 mb [
submit][
status][
discuss]
給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。
題目保證有解。
第一行v,e,need分別表示點數,邊數和需要的白色邊數。
接下來e行,每行s,t,c,col表示這邊的端點(點從0開始標號),邊權,顏色(0白色1黑色)。
一行表示所求生成樹的邊權和。
v<=50000,e<=100000,所有資料邊權為[1,100]中的正整數。
2 2 1
0 1 1 1
0 1 2 0
2原資料出錯,現已更新 by
liutian
,但未重測---2016.6.24
就二分再kruskal一下就完了。沒做頭
#include#include#include#includeusing namespace std;
const int n = 100005;
struct edgee[n];
int a[n],u[n],v[n],w[n],c[n],fa[n],n,m,maxn,ans,scnt,cnt,need;
int find( int x )
bool cmp( edge a, edge b )
bool check( int x )
std::sort( e+1, e+m+1, cmp );
for( int i = 1; i <= m; i++ )
} return scnt >= need;
}int main()
printf("%d", 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...