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