給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。
題目保證有解。
好像有個套路:
對於有個數要求的某種邊,可以改變它們的權值,以改變它們加入最小生成樹的順序(包括移出最小生成樹)。
改變量可以二分。因為改變量(包括符號)越大,加入的邊就越少。
細節:
#include#include#include#include#include#include#define ll long long
#define re register
#define il inline
#define db double
#define eps 1e-5
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int n=1e5+100;
int n,m,k,f[n];
ll ans;
bool use[n];
struct dat
il int find(re int x)
il int check(re int x)
sort(a+1,a+1+m);
fp(i,1,m)
return tag>=k;
}int main()
re int l=-105,r=105,gu=0;
while(l<=r)
check(gu);
printf("%lld\n",ans-gu*k);
return 0;
}
國家集訓隊2 Tree I 題解
題目傳送門 題目大意 給一張圖,找到一棵恰好包含 k kk 條白邊的最小權值生成樹。這是 wqs wqswq s 二分的一道很入門的題。設 g i g i g i 表示包含恰好 i ii 條白邊的生成樹中權值最小的那棵樹的權值。顯然 g i g i g i 是個下凸包,那麼我們二分乙個斜率 k kk...
P2619 國家集訓隊2 Tree I
新增鏈結描述 二分題,考慮kruskal的過程,讓白邊變成need條,權值定了的時候,最小生成樹是定的,如果現在白邊的數量大於need條,那麼我們需要整體增加白邊的權值,相當於讓白邊減少,如果多的話相反。至於增加多少,需要二分去判定。這道題細節挺多的,比如可能有權值 mid會導致白邊多了,權值 mi...
P2619 國家集訓隊2 Tree I
鏈結分析 為了確定白邊選入的數量,所以給白邊加乙個權值,二分這個值,然後最小生成樹。可以發現白邊的數量雖這個值的增大而減小,滿足單調性。有乙個問題 如果在二分過程中給白邊加上mid,白邊數比need多,加mid 1,白邊數need少。即存在很多相等的白邊 和 很多相等的黑邊。如果白邊大於need一定...