题目意思:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的。边上有权值,

问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条。题目保证有解。

题解:题目意思很简单就是求MST且A公司要有且仅有k条边在树中,刚开始做的时候用贪心的方式求

最小生成树结果WA,后来看了下别人的题解,二分出一个最大值delta使得A公司的边加上这个值后再

求MST时A公司的边有大于等于k条,然后答案就是cost of MST - k * delta。思想就是用一个delta去

逼近答案。当delta越大的时候A公司的边就越少,反之越多。所以二分delta可以找到使得A公司刚好取K条边的要求。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. struct node
  6. {
  7. int u,v,cost;
  8. bool operator < (node a)const{
  9. return cost < a.cost;
  10. }
  11. }arr[2][100005];
  12. int father[100005];
  13. int n,m,k,num[2],mincost;
  14. int find(int x){
  15. if( x != father[x])
  16. return father[x] = find(father[x]);
  17. return father[x];
  18. }
  19. int union_set(int x,int y){
  20. x = find(x);
  21. y = find(y);
  22. if( x != y){
  23. father[x] = y;
  24. return 1;
  25. }
  26. return 0;
  27. }
  28. bool check(int delta){
  29. int tel = k,Union = n-k-1;
  30. int nn = n,i,j;
  31. mincost = 0;
  32. for( i = 0; i <= n; i++)father[i] = i;
  33. i = j = 0;
  34. while( nn > 1 ){
  35. if( j < num[1] && ( i >= num[0] || arr[0][i].cost + delta > arr[1][j].cost)){
  36. if( union_set(arr[1][j].u,arr[1][j].v ) )
  37. {
  38. mincost += arr[1][j].cost;
  39. nn--;
  40. Union--;
  41. }
  42. j++;
  43. }
  44. else{
  45. if( union_set(arr[0][i].u,arr[0][i].v ) ){
  46. mincost += arr[0][i].cost + delta;
  47. nn--;
  48. tel --;
  49. }
  50. i++;
  51. }
  52. }
  53. return tel <= 0;
  54. }
  55. int main(){
  56. struct node tmp;
  57. int cas = 1;
  58. int u,v,cost,x;
  59. int l,r,mid,m;
  60. freopen("in.txt","r",stdin);
  61. while( ~scanf("%d%d%d",&n,&m,&k)){
  62. num[0] = num[1] = r = 0;
  63. for(int i = 0; i < m; i++){
  64. father[i] = i;
  65. scanf("%d%d%d%d",&tmp.u,&tmp.v,&tmp.cost,&x);
  66. arr[x][num[x]++] = tmp;
  67. }
  68. for( int i = 0; i < 2; i++)
  69. sort(arr[i],arr[i]+num[i]);
  70. l = -110,r = 110;
  71. int res;
  72. while( l <= r){
  73. mid = (l+r)>>1;
  74. if( check(mid) ){
  75. res = mincost;
  76. m = mid;
  77. l = mid + 1;
  78. }
  79. else r = mid - 1;
  80. }
  81. printf("Case %d: %d\n",cas++,res - m*k);
  82. }
  83. }

  

HDOJ 4253 Two Famous Companies 二分+MST的更多相关文章

  1. hdu4253 Two Famous Companies --- 二分+MST

    给n个点.m条边的图.每条边要么属于a公司,要么属于b公司.要求一颗最小生成树,条件是当中属于a公司的边数为k. 这题做法非常巧妙. 要求最小生成树,但有一定限制,搜索.贪心显然都不正确. 要是能找到 ...

  2. HDU 4253 Two Famous Companies

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

  3. hdu 4253 Two Famous Companies BZOJ 2654 tree

    [题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...

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

    http://www.spoj.com/problems/COMPANYS/en/ 题目要求恰好有k条0类边的最小生成树 每次给0类边的权值加或减某个值delta,直到最小生成树上恰好有k条边为0,此 ...

  5. HDU 4253-Two Famous Companies(二分+最小生成树)

    Description In China, there are two companies offering the Internet service for the people from all ...

  6. BZOJ 2654 & 玄学二分+MST

    题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一 ...

  7. [BZOJ2654]tree(二分+MST)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...

  8. hdoj 5355 Cake(分析+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 分蛋糕的题目,有1-n大小的n个蛋糕,要求平均分成m份,不能切开蛋糕 #include<s ...

  9. HDOJ 3622 - Bomb Game 2-sat+二分....细心...

    题意: 有N个炸弹..每个炸弹有两个位置可以选择..把炸弹放到其中一个地方去...炸弹的爆炸范围是其为圆心的圆...两个炸弹不能有攻击范围上的重合..问要满足条件..炸弹爆炸范围的半径最长能是多少.. ...

随机推荐

  1. 【Intellij】导入 jar 包

    选中工具栏上"File"--->"Project Structure"--->选择“Libraries”--->点击“+”--->选择自 ...

  2. LR有的JMeter也有之三“集合点”

    继续上两篇的文章内容和思路进行.(文思如尿崩,谁与我争锋----韩寒)哈哈! 集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念 ...

  3. 【Java例题】3.6 计算arcsin(x)的值

    6.使用泰勒展开式计算arcsin(x)的值. arcsin(x)=x+x^3/(2*3)+1*3*x^5/(2*4*5)+...+ (2n)!*x^(2n+1)/(2^2n)*(n!)^2*(2n+ ...

  4. elk系列教程:docker中安装配置elk

    elasticSearch Docker安装elasticsearch: docker pull docker.io/elasticsearch:7.2.0 启动: docker run -p 920 ...

  5. 自定义markdown代码高亮显示-cnblog

    这个代码高亮..一点儿都不高亮...... cnblog里已经有闻道先者贴出代码了, https://www.cnblogs.com/liutongqing/p/7745413.html 效果大概是这 ...

  6. eclipse Maven配置以及使用方法

    简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首 ...

  7. 开园第一篇---有关tensorflow加载不同模型的问题

    写在前面 今天刚刚开通博客,主要想法跟之前某位博主说的一样,希望通过博客园把每天努力的点滴记录下来,也算一种坚持的动力.我是小白一枚,有啥问题欢迎各位大神指教,鞠躬~~ 换了新工作,目前手头是OCR项 ...

  8. 关于Oracle本地连接出现与监听有关的问题的解决方法探讨

    关于Oracle本地连接出现与监听有关的问题的解决方法探讨 监听的作用: 用于应用桌面即用户与数据库服务器建立连接的媒介,客户端发送连接请求,监听识别请求并建立客户端与服务器的连接后,监听的使命并完成 ...

  9. SIMBOSS:物联网业务如何应用领域驱动设计?

    前言 在这个万物互联的时代,物联网业务蓬勃发展,但也瞬息万变,对于开发人员来说,这是一种挑战,但也是一种“折磨”. 在业务发展初期,因为时间有限,我们一般会遵循“小步快跑,迭代试错”的原则进行业务开发 ...

  10. IoT时代:Wi-Fi“配网”技术剖析总结

    导读 近年来,物联网市场竞争激烈,从物联网平台厂商,设备生产商,到服务提供商,都在涌入这片红海.预计到2020年,全球联网设备数量将达到260亿个,年复合增长率达到20%:全球联网设备带来的数据将达到 ...