hdu4253 二分 MST 經典模型)

2022-08-14 08:00:22 字數 1181 閱讀 1997

n個點,m條邊,邊分為a,b兩類,要構造一棵最小生成樹,且樹中a邊數量為k。

我們可以通過給所有a邊加上權值dx來控制樹中a邊的數量。顯然,當dx增大,a邊數量kk會減少。

二分dx,

當kk>=k,增大dx(即l=mid+1),同時更新ans=sum(mst)-mid*k;

當kk

1 #include2 #include3 #include4

using

namespace

std;

5struct

node

6ey[110000],el[110000];9

int n,m,k,numey,numel,sset[110000

],sum;

10const

int mmax=1

<<30;11

int ffind(int

x)12

18void mmerge(int a,int

b)19

25bool

cmp(node x1,node y1)

2629

int kruscal(int

dx)30

50 posey++;51}

52else

5362 posel++;63}

64if(num==n-1) break;65

}66if(kk>=k) return1;

67else

return0;

68}69int

main()

7085

else

8691

}92 sort(ey,ey+numey,cmp);

93 sort(el,el+numel,cmp);

94 ey[numey].w=el[numel].w=mmax;

95int l=-100,r=100,mid,ans=0;96

while(l<=r)

97104

else r=mid-1

;105

}106 printf("

case %d: %d\n

",++casnum,ans);

107}

108return0;

109 }

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...

HDU 4253 二分 最小生成樹

題意 題意是給出n個點,m條邊其中有的屬於a有的屬於b,要求構造最小生成樹 並且 包含k條a的邊 求最小花費 思路 這題思路有點nb 我們二分乙個權值給屬於a公司的邊加上 我們知道kruskal需要按照權值排序 那麼屬於a的邊一定會靠後點 這樣跑一遍kruskal 看看構造出來的是否滿足有k條屬於a...