給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有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
先跑一遍最小生成樹發現選到的白邊數和need是有差距的
把白邊的大小整體上移或下移是對的
二分偏移量check白邊選擇量即可
*注意優先選白邊
#include#include#includeusing namespace std;
int i,m,n,j,k,need,l=-150,r=150,tmp,f[100001];
struct vv
a[1000001];
bool cmp(vv a,vv b)
check(tmp);
printf("%d",k-tmp*need);
}
P2619 國家集訓隊2 Tree I
新增鏈結描述 二分題,考慮kruskal的過程,讓白邊變成need條,權值定了的時候,最小生成樹是定的,如果現在白邊的數量大於need條,那麼我們需要整體增加白邊的權值,相當於讓白邊減少,如果多的話相反。至於增加多少,需要二分去判定。這道題細節挺多的,比如可能有權值 mid會導致白邊多了,權值 mi...
P2619 國家集訓隊2 Tree I
鏈結分析 為了確定白邊選入的數量,所以給白邊加乙個權值,二分這個值,然後最小生成樹。可以發現白邊的數量雖這個值的增大而減小,滿足單調性。有乙個問題 如果在二分過程中給白邊加上mid,白邊數比need多,加mid 1,白邊數need少。即存在很多相等的白邊 和 很多相等的黑邊。如果白邊大於need一定...
國家集訓隊2 Tree I
給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。題目保證有解。好像有個套路 對於有個數要求的某種邊,可以改變它們的權值,以改變它們加入最小生成樹的順序 包括移出最小生成樹 改變量可以二分。因為改變量 包括符號 越大,加入的邊就越少。細節 include ...