hdu4253 Two Famous Companies --- 二分+MST

给n个点,m条边的图,每条边要么属于a公司,要么属于b公司。要求一颗最小生成树,条件是其中属于a公司的边数为k。

这题做法很巧妙。

要求最小生成树,但有一定限制,搜索、贪心显然都不对。

要是能找到一种合理的控制方法,使得求MST的过程中可以控制a公司边的数量,那样问题就解决了。

所以我们可以人为给a公司的边加上一定的权值,使得其中一些边不得不退出MST的选择范围内。

如果此时求的mst里a公司的边数>k,那么就要增加权值;边数<k时,权值为负。

所以,通过二分边权值,可以使得求得mst里所含a公司的边数逐渐逼近k,此时记录答案,因为一定有解,所以最终一定是所求答案。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxm=100010;
const int maxn=50010;
struct node
{
    int u,v,w,ty;
}e[maxm];
int r[maxn],n,m,k,ret,telecom;

bool cmpw(node a,node b)
{
    if(a.w!=b.w) return a.w<b.w;
    return a.ty<b.ty;
}
int root(int a)
{
    if(r[a]==-1) return a;
    return r[a]=root(r[a]);
}
bool kru(int x)
{
    for(int i=0;i<m;i++)
        if(e[i].ty==0) e[i].w+=x;
    sort(e,e+m,cmpw);
    memset(r,-1,sizeof r);
    int edge=0;telecom=n-1;ret=0;
    for(int i=0;i<m;i++)
    {
        int ra=root(e[i].u);
        int rb=root(e[i].v);
        if(ra!=rb)
        {
            r[ra]=rb;
            ret+=e[i].w;
            telecom-=e[i].ty;
            if(++edge==n-1) break;
        }
    }
    for(int i=0;i<m;i++)
        if(e[i].ty==0) e[i].w-=x;
    return telecom>=k;
}

int main()
{
    int cas=1;
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        for(int i=0;i<m;i++)
            scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].w,&e[i].ty);
        int l=-100,r=100,mid,ans=0x3f3f3f3f;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(kru(mid)) l=mid+1,ans=ret-mid*k;
            else r=mid-1;
        }
        printf("Case %d: %d\n",cas++,ans);
    }
    return 0;
}
时间: 2024-10-10 14:59:21

hdu4253 Two Famous Companies --- 二分+MST的相关文章

HDU 4253 Two Famous Companies

Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 425364-bit integer IO format: %I64d      Java class name: Main In China, there are two companies offering the Internet service for the peo

Two Famous Companies 【二分+最小生成树】

Problem DescriptionIn China, there are two companies offering the Internet service for the people from all cities: China Telecom and China Unicom. They both are planning to build cables between cities. Obviously, the government wants to connect all t

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; 当kk<k,减小dx(即r=mid-1). 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using n

SPOJ COMPANYS Two Famous Companies 最小生成树,二分,思路 难度:2

http://www.spoj.com/problems/COMPANYS/en/ 题目要求恰好有k条0类边的最小生成树 每次给0类边的权值加或减某个值delta,直到最小生成树上恰好有k条边为0,此时得到最小生成树的权值-更改的值*k即为答案 但是直接这么做的话会超时,因为都是整数权值,所以只需要优先取0类边,二分整数delta即可 如果直接给所有0类边减100,让0类边优先选择,那么会导致整棵树不一定是最小的,应该优先选择的1类边没有选择 #include <cstdio> #includ

BZOJ 2654 &amp; 玄学二分+MST

题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一样慢慢往里面加...不过讲课的时候跟原题有点出入...这里只有k条边好像比较难维护... 正解也非常巧妙...首先如果有一棵MST,他所含白边数量多于k,那么我们如果可以适当增加白边的边权那么我们就可以减少它的边而且达到最优....想想很有道理你让我证明那有点日了狗了... 然后我们就二分白边的增加

BZOJ 2654: tree( 二分 + MST )

我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i

并查集&amp;MST

[HDU] 1198 Farm Irrigation 基础最小生成树★ 1598 find the most comfortable road 枚举+最小生成树★★ 1811 Rank of Tetris 并查集+拓扑排序★★ 3926 Hand in Hand 同构图★ 3938 Portal 离线+并查集★★ 2489     Minimal Ratio Tree dfs枚举组合情况+最小生成树★ 4081     Qin Shi Huang's National Road System 最

June 11th 2017 Week 24th Sunday

I hope I can find the one who is afraid of losing me. 我希望找到一个担心失去我的人. When I was young, sometimes I threatened my parents that I would commit suicide if they kept on blaming me for my misdeeds. Now I grow up into an adult, I realize that I rally had

暑假集训-合训第三场

ID Origin Title 31 / 51 Problem A HDU 4175 Class Schedule 27 / 140 Problem B HDU 4193 Non-negative Partial Sums   5 / 17 Problem C HDU 4212 Shut the Box   3 / 9 Problem D HDU 4216 Computational Geometry?   2 / 3 Problem E HDU 4219 Randomization?