鏈結分析:
為了確定白邊選入的數量,所以給白邊加乙個權值,二分這個值,然後最小生成樹。可以發現白邊的數量雖這個值的增大而減小,滿足單調性。
有乙個問題:如果在二分過程中給白邊加上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 #include78using
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 ...