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