HDU 4253 二分 最小生成樹

2021-10-05 14:37:04 字數 1022 閱讀 6443

題意:

題意是給出n個點,m條邊其中有的屬於a有的屬於b,要求構造最小生成樹 並且 包含k條a的邊 求最小花費

思路:這題思路有點nb 我們二分乙個權值給屬於a公司的邊加上 我們知道kruskal需要按照權值排序 那麼屬於a的邊一定會靠後點 這樣跑一遍kruskal 看看構造出來的是否滿足有k條屬於a的邊 如果不滿足那麼權值下調 r = mid 否則 權值上調 l = mid 這樣單調性就出來了 注意給邊加上權值後記得還原 答案的話因為你多加了k個mid權值 k是邊數 mid是你二分出來的權值 記得減去

#include

using

namespace std;

const

int n =

50005

,m =

100005

;struct node

a[m]

;int n, m, k, ans, res;

int fa[n]

;void

init()

intfindx

(int x)

bool

cmp(node a,node b)

bool

kruskal

(int x)

init()

;sort

(a,a + m,cmp)

;int cnt =0;

int sum = n -1;

res =0;

for(

int i =

0; i < m; i ++)if

(cnt == n -1)

break;}

for(

int i =

0; i < m; i ++

)return sum >= k;

}int

main()

printf

("case %d: %d\n"

,cas ++

,ans);}

return0;

}

hdu 4253(二分 最小生成樹)

思路 求最小生成樹是顯然的,題目還多了乙個限制條件,就是屬於a公司的邊必須有k條,於是我們可以二分來實現這個目的,找乙個盡量大的mid,用a公司的每條邊都加上這個mid,使得求出的最小生成樹中包含a公司的邊至少k條,於是花費ans sum k mid。1 include2 include3 incl...

hdu 4253(二分 最小生成樹)

思路 求最小生成樹是顯然的,題目還多了乙個限制條件,就是屬於a公司的邊必須有k條,於是我們可以二分來實現這個目的,找乙個盡量大的mid,用a公司的每條邊都加上這個mid,使得求出的最小生成樹中包含a公司的邊至少k條,於是花費ans sum k mid。1 include2 include3 incl...

hdu4253 二分 MST 經典模型)

n個點,m條邊,邊分為a,b兩類,要構造一棵最小生成樹,且樹中a邊數量為k。我們可以通過給所有a邊加上權值dx來控制樹中a邊的數量。顯然,當dx增大,a邊數量kk會減少。二分dx,當kk k,增大dx 即l mid 1 同時更新ans sum mst mid k 當kk1 include2 incl...