國家集訓隊2 Tree I

2022-05-08 01:00:07 字數 886 閱讀 7228

給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有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一定...