题目大意:有一张n个顶点,m条边的有向图,根节点为0。每条边有两个权值,一个是费用c,一个是长度b。问在总费用不超过cost的情况下选出若干条边,使得n个点连通时的边的最短长度的最大值是多少。

题目分析:如果已知这个最短距离的最大值d,则问题就变成了:用长度不小于d的边能否构成一个总权值不大于cost的最小树形图。因此,二分枚举d,用朱-刘 算法判断即可。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<vector>
  4. # include<cstring>
  5. # include<algorithm>
  6. using namespace std;
  7. # define REP(i,s,n) for(int i=s;i<n;++i)
  8. # define LL long long
  9. # define CL(a,b) memset(a,b,sizeof(a))
  10.  
  11. const int INF=1<<30;
  12. struct Edge
  13. {
  14. int fr,to,w,d;
  15. };
  16. Edge e1[10005],e[10005];
  17. int n,m,cost,vis[65],ID[65],pre[65],in[65];
  18.  
  19. int judge(int root,int nv,int ne)
  20. {
  21. int res=0;
  22. while(1){
  23. REP(i,0,nv) in[i]=INF;
  24. REP(i,0,ne) if(e[i].fr!=e[i].to&&in[e[i].to]>e[i].w){
  25. in[e[i].to]=e[i].w;
  26. pre[e[i].to]=e[i].fr;
  27. }
  28. in[root]=0;
  29. REP(i,0,nv) if(in[i]==INF) return -1;
  30. int nodeCnt=0;
  31. CL(ID,-1);
  32. CL(vis,-1);
  33. REP(i,0,nv){
  34. res+=in[i];
  35. int v=i;
  36. while(vis[v]!=i&&ID[v]==-1&&v!=root){
  37. vis[v]=i;
  38. v=pre[v];
  39. }
  40. if(v!=root&&ID[v]==-1){
  41. for(int u=pre[v];u!=v;u=pre[u])
  42. ID[u]=nodeCnt;
  43. ID[v]=nodeCnt++;
  44. }
  45. }
  46. if(nodeCnt==0) break;
  47. REP(i,0,nv) if(ID[i]==-1) ID[i]=nodeCnt++;
  48. REP(i,0,ne){
  49. int v=e[i].to;
  50. e[i].fr=ID[e[i].fr];
  51. e[i].to=ID[e[i].to];
  52. if(e[i].fr!=e[i].to)
  53. e[i].w-=in[v];
  54. }
  55. nv=nodeCnt;
  56. root=ID[root];
  57. }
  58. return res;
  59. }
  60.  
  61. int main()
  62. {
  63. int T;
  64. scanf("%d",&T);
  65. while(T--)
  66. {
  67. scanf("%d%d%d",&n,&m,&cost);
  68. int l=0,r=0;
  69. REP(i,0,m){
  70. scanf("%d%d%d%d",&e1[i].fr,&e1[i].to,&e1[i].d,&e1[i].w);
  71. r=max(r,e1[i].d);
  72. }
  73. int ans=-1;
  74. while(l<r){
  75. int mid=l+(r-l+1)/2,cnt=0;
  76. REP(i,0,m) if(e1[i].d>=mid) e[cnt++]=e1[i];
  77. int x=judge(0,n,cnt);
  78. if(x>0&&x<=cost){
  79. ans=l=mid;
  80. }else
  81. r=mid-1;
  82. }
  83. if(ans<0)
  84. printf("streaming not possible.\n");
  85. else
  86. printf("%d kbps\n",ans);
  87. }
  88. return 0;
  89. }

  

UVA-11865 Stream My Contest (朱-刘 算法+二分)的更多相关文章

  1. 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分)

    layout: post title: 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分) author: "luowentaoaa" catalog: tr ...

  2. UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)

    题意: 给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽.给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少? 思路: 点数才60,而带宽范围也不大,可 ...

  3. uva11865 朱刘算法+二分

    这题说的需要最多花费cost元来搭建一个比赛网络,网络中有n台机器,编号为0 - n-1其中机器0 为服务器,给了n条线有向的和他们的花费以及带宽 计算,使得n台连接在一起,最大化网络中的最小带宽, ...

  4. UVA 11865 Stream My Contest(最小树形图)

    题意:N台机器,M条有向边,总资金C,现要到搭建一个以0号机(服务器)为跟的网路,已知每条网线可以把数据从u传递到v,其带宽为d,花费为c,且d越大,传输速度越快,问能够搭建的传输速度最快的网络d值是 ...

  5. UVA 11865 Stream My Contest (二分+最小树形图)

    题意:给定一个网络,一个服务器,其他的是客户机,有 m 条连线,每条有一个带宽和花费(单向边),让你用不超过 c 的花费,使得 0 到 所有的机器都能到达,并且使得最小带宽最大. 析:很明显是二分题, ...

  6. hdu2121 - Ice_cream’s world II(朱刘算法,不固定根)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目意思大概是要你在一些城市中选一个做首都 , 要求首都都能到其他城市 , 道路花费要最少 , ...

  7. UVa11183 Teen Girl Squad, 最小树形图,朱刘算法

    Teen Girl Squad  Input: Standard Input Output: Standard Output You are part of a group of n teenage ...

  8. 最小树形图——朱刘算法(Edmonds)

    定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...

  9. uvalive 11865 Stream My Contest

    题意: 有一个网络中心,和许多个城市,网络中心以及城市之间有若干条边,这些边有两个属性,最大带宽和修建费用. 现在要用最多不超过C的费用修建网络,使得每个城市都有网络连接,最大化最小带宽. 带宽限制是 ...

随机推荐

  1. vmware下安装centos7

    下载vmware http://down-www.newasp.net/pcdown/big/wm_pro_14_win.rar 下载centos7 https://www.centos.org/do ...

  2. Mybatis中的#与$的区别

    一.对比场景 场景:数据库分表时,需要将分表的表序号传入的sql中. SpringBoot中使用注解如下: @Insert("insert into collect_#{tblNum}(id ...

  3. 学会JS的this这一篇就够了

    转自:http://www.imooc.com/article/1758 以前看某本书上讲: 掌握了JS中this的用法才算真正的跨过了JS的门槛 我深以为是!但是JS的this却并不是那么简单的内容 ...

  4. mysql5.7 linux安装参考

    安装参考: https://www.cnblogs.com/ianduin/p/7679239.html http://blog.csdn.net/wb96a1007/article/details/ ...

  5. 130. Surrounded Regions(周围区域问题 广度优先)(代码未完成!!)

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  6. ACM-ICPC 2018 沈阳赛区网络预赛 G. Spare Tire (容斥原理)

    可推出$a_n = n^2+n, $ 设\(S_n = \sum_{i=1}^{n} a_i\) 则 \(S_n = \frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2} ...

  7. Unity状态机的实现,以《塔防》为例

    什么是有限状态机? 通俗点讲,有限状态机是:将对象的状态(攻击.闲置.晕眩)的实现代码,提取出来,封装成状态.由状态机负责在各个状态之间调度. 对象持有状态管理类(状态机)的引用,与具体的状态解耦. ...

  8. 计算mysql 数据库 表大小 服务器传输 小写表明转成大写

    //数据库表存储大小 select table_schema,table_name,table_rows,concat(round(data_length/1024/1024/1024,2),'GB' ...

  9. Git笔记之初识vi编辑器

    1.vi编辑器 如同Windows下的记事本,vi编辑器是Linux下的标配,通过它我们可以创建.编辑文件.它是一个随系统一起安装的文本编辑软件. vi编辑器提供了3种模式,分别是命令模式.插入模式. ...

  10. C++ 单词接龙

    问题描述: 拉姆刚刚开始学习英文字母,对单词排序很感兴趣,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一个单词的尾字母相同,力能编写一个计算机程序帮助拉姆进行判断 ...