hdu 4253(二分 最小生成樹)

2021-09-06 10:20:55 字數 1155 閱讀 3905

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

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define maxn 50000+50

7#define maxm 100000+100

8#define inf 1<<30

9int

parent[maxn];

10struct

edgew[maxm],b[maxm];

13int

n,m,k,sum,cnt,cntw,cntb;

1415

int find(int

x)16

2223

int cmp(const edge &p,const edge &q)

2427

28bool union(int u,int

v)29

3536

bool judge(int

w)37

45 la++;

46 }else50}

51if(cnt>=k)return

true;52

return

false;53

}545556

intmain()

5765

else 66}

67 sort(b,b+cntb,cmp);

68 sort(w,w+cntw,cmp);

69 b[cntb].w=w[cntw].w=inf;

70int l=-100,r=100

,mid;

71while(l<=r)else

77 r=mid-1;78

}79 printf("

case %d: %d\n

",t++,ans);80}

81return0;

82 }

view code

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

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