HDOJ 4253 Two Famous Companies 二分+MST
生活随笔
收集整理的這篇文章主要介紹了
HDOJ 4253 Two Famous Companies 二分+MST
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目意思:給出n個(gè)點(diǎn),m條邊,邊分為兩種,一種是A公司的,一種是B公司的。邊上有權(quán)值,
問用n-1條邊把n個(gè)點(diǎn)連起來的最小費(fèi)用是多少,其中A公司的邊剛好有k條。題目保證有解。
?
題解:題目意思很簡單就是求MST且A公司要有且僅有k條邊在樹中,剛開始做的時(shí)候用貪心的方式求
最小生成樹結(jié)果WA,后來看了下別人的題解,二分出一個(gè)最大值delta使得A公司的邊加上這個(gè)值后再
求MST時(shí)A公司的邊有大于等于k條,然后答案就是cost of MST - k * delta。思想就是用一個(gè)delta去
逼近答案。當(dāng)delta越大的時(shí)候A公司的邊就越少,反之越多。所以二分delta可以找到使得A公司剛好取K條邊的要求。
?
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct node {int u,v,cost;bool operator < (node a)const{return cost < a.cost;} }arr[2][100005]; int father[100005]; int n,m,k,num[2],mincost; int find(int x){if( x != father[x])return father[x] = find(father[x]);return father[x]; } int union_set(int x,int y){x = find(x);y = find(y);if( x != y){father[x] = y;return 1;}return 0; } bool check(int delta){int tel = k,Union = n-k-1;int nn = n,i,j;mincost = 0;for( i = 0; i <= n; i++)father[i] = i;i = j = 0;while( nn > 1 ){if( j < num[1] && ( i >= num[0] || arr[0][i].cost + delta > arr[1][j].cost)){if( union_set(arr[1][j].u,arr[1][j].v ) ){mincost += arr[1][j].cost;nn--;Union--;}j++;}else{if( union_set(arr[0][i].u,arr[0][i].v ) ){mincost += arr[0][i].cost + delta;nn--;tel --;}i++;}}return tel <= 0; } int main(){struct node tmp;int cas = 1;int u,v,cost,x;int l,r,mid,m;freopen("in.txt","r",stdin);while( ~scanf("%d%d%d",&n,&m,&k)){num[0] = num[1] = r = 0;for(int i = 0; i < m; i++){father[i] = i;scanf("%d%d%d%d",&tmp.u,&tmp.v,&tmp.cost,&x);arr[x][num[x]++] = tmp;}for( int i = 0; i < 2; i++)sort(arr[i],arr[i]+num[i]);l = -110,r = 110;int res;while( l <= r){mid = (l+r)>>1;if( check(mid) ){res = mincost;m = mid;l = mid + 1;}else r = mid - 1;}printf("Case %d: %d\n",cas++,res - m*k);} }
轉(zhuǎn)載于:https://www.cnblogs.com/LUO257316/p/3221701.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的HDOJ 4253 Two Famous Companies 二分+MST的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。