題意:
題意是給出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...