【题意】:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的。边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条。题目保证有解。

思路:我们发现,如果我们给白边增加权值,做最小生成树,由于白边权值增大,导致不容易选白边。记f(x)为给白边增加x权值,做最小生成树后,选白边的数量,可以发现,f(x)随x增大而减小。所以可以二分x

首先,直接做MST的话白色边的数量是无法估计的。可能比要求的多,也可能更少

所以考虑怎样调整白色边的数量
通过这个思路,可以想到如果把所有白色边的权值加上/减去一个Δ,那么不考虑答案正确性,可以保证这时候MST跑出来之后白色边的数量一定会增加/减少
那么我们就可以直接二分一个值,使得白边的数量符合要求。
事实上可以证明当我们限定白边的数量一定的时候,MST的答案也是唯一的
那么我们在白边上加上Δ之后算出来MST的答案会多出need*Δ,直接减掉就好了
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int v1,v2;
int w;
} s[],t[];
int n,m,k,cnts,cntt;
int father[],sum;
int cmp(const node a,const node b)
{
return a.w<b.w;
}
int find(int x)
{
int i=x,root;
while(x!=father[x])
x=father[x];
root=x;
x=i;
while(x!=father[x])
{
i=father[x];
father[x]=root;
x=i;
}
return root;
}
int deal(int x)
{
for(int i=; i<=n; i++)
father[i]=i;
int lens=,lent=,pp=;
sum=;
while(lens<cnts||lent<cntt)
{ if(s[lens].w+x<=t[lent].w)
{
int s1=find(s[lens].v1);
int s2=find(s[lens].v2);
if(s1!=s2)
{
father[s1]=s2;
sum+=s[lens].w+x;
pp++;
}
lens++;
}
else
{
int s1=find(t[lent].v1);
int s2=find(t[lent].v2);
if(s1!=s2)
{
father[s1]=s2;
sum+=t[lent].w;
}
lent++;
} }
if(pp>=k) return ;
else return ;
}
int main()
{
int text=;
while(scanf("%d%d%d",&n,&m,&k)>)
{
cnts=,cntt=;
for(int i=; i<m; i++)
{
int v1,v2,w,tmp;
scanf("%d%d%d%d",&v1,&v2,&w,&tmp);
if(tmp==)
{
s[cnts].v1=v1;
s[cnts].v2=v2;
s[cnts].w=w;
cnts++;
}
if(tmp==)
{
t[cntt].v1=v1;
t[cntt].v2=v2;
t[cntt].w=w;
cntt++;
}
}
sort(s,s+cnts,cmp);
sort(t,t+cntt,cmp);
t[cntt].w=s[cnts].w=(<<);
printf("Case %d: ",++text);
int l=-,r=;
int ans=;
while(l<=r)
{
//sum=0;
int mid=(l+r)/;
if(deal(mid))
{
l=mid+;
ans=sum-mid*k;
}
else r=mid-;
}
printf("%d\n",ans);
}
return ;
}

hdu 4253 Two Famous Companies BZOJ 2654 tree的更多相关文章

  1. HDU 4253 Two Famous Companies

    Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. O ...

  2. BZOJ 2654: tree( 二分 + MST )

    我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...

  3. BZOJ 2654: tree Kruskal+二分答案

    2654: tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1863  Solved: 736[Submit][Status][Discuss ...

  4. bzoj 2654 tree - 二分法 - 最小生成树

    给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行,每行 ...

  5. BZOJ 2654: tree

    Description \(n\) 个点, \(m\) 条边,边有权值和黑/白色,求含有 \(need\) 个白边的生成树. Sol 二分+Kruskal. 将每条白边都加上一个权值,然后跑最小生成树 ...

  6. [BZOJ 2654]tree(陈立杰)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  7. bzoj 2654 tree 二分+kruskal

    tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2739  Solved: 1126[Submit][Status][Discuss] Des ...

  8. BZOJ 2654 tree(二分答案+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2654 [题目大意] 给你一个无向带权连通图,每条边是黑色或白色. 让你求一棵最小权的恰 ...

  9. BZOJ 2654: tree(二分 最小生成树)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2901  Solved: 1196[Submit][Status][Discuss] Descript ...

随机推荐

  1. mybatis中的mapper.xml

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  2. 使用WebView加载HTML代码

    使用EditText显示HTML字符串时,EditText不会对HTML标签进行任何解析,而是直接把所有HTML标签都显示出来-----就像用普通记事本显示一样:如果应用程序想重新对HTML字符串进行 ...

  3. 微信支付官方SDK V3 .NET版的坑

    但是支付成功后却不能正确的执行支付结果js回调函数.看看其页面的点击事件是放在asp:Button上面的.我们知道在asp.net webform中,按钮的点击是有页面回调后台的.也就是其实点击了之后 ...

  4. iOS 消息推送原理及实现Demo

    一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Pr ...

  5. HDU 4405 Aeroplane chess 概率DP 难度:0

    http://acm.hdu.edu.cn/showproblem.php?pid=4405 明显,有飞机的时候不需要考虑骰子,一定是乘飞机更优 设E[i]为分数为i时还需要走的步数期望,j为某个可能 ...

  6. C#生成唯一的ID保存到数据库

    直接用.NET Framework 提供的 Guid() 函数: Guid.NewGuid()是指生成唯一码的规则 System.Guid.NewGuid().ToString()全球唯一标识符 (G ...

  7. Oracle创建用户并给用户授权查询指定表或视图的权限

    MSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND  DEFAULT TABLESPACE "TBS_DN ...

  8. JS图片加载失败显示默认图片

    代码如下: <div id='photo<%# Container.DataItemIndex+1%>' style="position: absolute; displa ...

  9. web安全测试-AppScan

    安全测试应该是测试中非常重要的一部分,但他常常最容易被忽视掉. 尽管国内经常出现各种安全事件,但没有真正的引起人们的注意.不管是开发还是测试都不太关注产品的安全.当然,这也不能怪我们苦B的“民工兄弟” ...

  10. 深入C#数据类型小部分第二章

    值类型和引用类型C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型. C#的引用类型包括:数组,用户定义的类.接口.委托,object,字符串. 数组的元素,不管是引用 ...