P2619 國家集訓隊2 Tree I

2022-04-06 14:01:53 字數 1230 閱讀 4095

鏈結分析:

為了確定白邊選入的數量,所以給白邊加乙個權值,二分這個值,然後最小生成樹。可以發現白邊的數量雖這個值的增大而減小,滿足單調性。

有乙個問題:如果在二分過程中給白邊加上mid,白邊數比need多,加mid+1,白邊數need少。即存在很多相等的白邊 和 很多相等的黑邊。

如果白邊大於need一定是不合法的解,之後當加到乙個數,使這些白邊和黑邊相等時,就可以隨意的替換了,也使解變得合法了。所以二分的過程ans是可以增大的,所以56行要是ans-k*x不能是ans-cntwhite*x

上述情況的樣例:

4 5 2

0 1 3 0

0 1 4 1

1 2 3 0

1 2 3 1

2 3 3 0

**:

1 #include2 #include3 #include4 #include5 #include6 #include7

8using

namespace

std;910

const

int n = 50100;11

12struct

edge

18 }e[200100

];19

intfa[n];

20int n,m,k,ans = 0;21

22 inline char

nc()

26 inline int

read()

32int find(int

x) 36

bool check(int

x) 40 sort(e+1,e+m+1

);41

for (int i=1; i<=n; ++i) fa[i] =i;

42int cnt = 0,cntwhite = 0,ans = 0;43

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

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

55if (cntwhite < k) return

false

;56 ans -= x *k;

57 ans =ans;

58return

true;59

}60intmain ()

65int l = -101,r = 101;66

while (l <=r)

71 cout <72return0;

73 }

P2619 國家集訓隊2 Tree I

新增鏈結描述 二分題,考慮kruskal的過程,讓白邊變成need條,權值定了的時候,最小生成樹是定的,如果現在白邊的數量大於need條,那麼我們需要整體增加白邊的權值,相當於讓白邊減少,如果多的話相反。至於增加多少,需要二分去判定。這道題細節挺多的,比如可能有權值 mid會導致白邊多了,權值 mi...

P2619 國家集訓隊2 Tree I

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

國家集訓隊2 Tree I

給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。題目保證有解。好像有個套路 對於有個數要求的某種邊,可以改變它們的權值,以改變它們加入最小生成樹的順序 包括移出最小生成樹 改變量可以二分。因為改變量 包括符號 越大,加入的邊就越少。細節 include ...