uva好题真多

本题用二分法找flow,把流量小于flow的全部筛掉,剩下的边建立最小树形图,如果权值大于c或者不能建图,那么修改二分边界

上代码,觉得最小树形图的代码很优美

  1. /*
  2. 题意:给定n个点,m条边,c块钱
  3. m条单向边 带有流量,并且会消耗一些钱
  4. 问怎么建立最大流量图
  5.  
  6. 二分流量,找到流量最大的能使消费低于c的方案
  7. 在朱刘算法时筛掉所有流量小于当前流量的网络边
  8. */
  9. #include<iostream>
  10. #include<cstring>
  11. #include<cstdio>
  12. #define MAXN 10005
  13. #define INF 0x3f3f3f3f
  14. #define ll long long
  15. using namespace std;
  16.  
  17. struct Node{
  18. int u,v,cost;
  19. }e[MAXN];
  20. int pre[MAXN],id[MAXN],vis[MAXN];
  21. ll in[MAXN];
  22. ll zhuliu(int root,int n,int m){
  23. ll res=;
  24. while(){
  25. for(int i=;i<n;i++) in[i]=INF;
  26. for(int i=;i<m;i++)
  27. if(e[i].u!=e[i].v && e[i].cost<in[e[i].v]){
  28. pre[e[i].v]=e[i].u;
  29. in[e[i].v]=e[i].cost;
  30. }
  31. for(int i=;i<n;i++)
  32. if(i!=root && in[i]==INF) return -;
  33. int tn=;
  34. memset(id,-,sizeof id);
  35. memset(vis,-,sizeof vis);
  36. in[root]=;
  37. for(int i=;i<n;i++){
  38. res+=in[i];
  39. int v=i;
  40. while(v!=root && id[v]==- && vis[v]!=i){
  41. vis[v]=i;
  42. v=pre[v];
  43. }
  44. if(id[v]==- && v!=root){
  45. for(int u=pre[v];u!=v;u=pre[u])
  46. id[u]=tn;
  47. id[v]=tn++;
  48. }
  49. }
  50.  
  51. if(tn==) break;
  52. for(int i=;i<n;i++)
  53. if(id[i]==-) id[i]=tn++;
  54. for(int i=;i<m;i++){
  55. int v=e[i].v;
  56. e[i].u=id[e[i].u];
  57. e[i].v=id[e[i].v];
  58. if(e[i].u!=e[i].v)
  59. e[i].cost-=in[v];
  60. }
  61. n=tn;
  62. root=id[root];
  63. }
  64. return res;
  65. }
  66. struct Edge{
  67. int u,v,cost;
  68. int flow; //网络的最大带宽
  69. }edge[MAXN];
  70. int judge(int flow,int n,int m,ll c){
  71. int totm=;//筛选边
  72. for(int i=;i<m;i++)
  73. if(flow<=edge[i].flow){
  74. e[totm].u=edge[i].u;
  75. e[totm].v=edge[i].v;
  76. e[totm++].cost=edge[i].cost;
  77. }
  78. int root=;
  79. int res=zhuliu(root,n,totm);
  80. if(res==- || res>c) return ;
  81. else return ;
  82. }
  83. int main(){
  84. int T,n,m;
  85. ll c;
  86. cin >> T;
  87. while(T--){
  88. scanf("%d%d%lld",&n,&m,&c);
  89. int l=,r=,mid;
  90. for(int i=;i<m;i++){//先输入所有边
  91. scanf("%d%d%d%d",&edge[i].u,&edge[i].v,&edge[i].flow,&edge[i].cost);
  92. l=min(l,edge[i].flow);
  93. r=max(r,edge[i].flow);
  94. }
  95. if(!judge(l,n,m,c)){
  96. printf("streaming not possible.\n");
  97. continue;
  98. }
  99. while(l<r){
  100. mid = l+(r-l+)/;
  101. if(judge(mid,n,m,c))//mid流量可以联通
  102. l=mid;
  103. else //无法联通,说明流量开大了
  104. r=mid-;
  105. }
  106. //二分到最后肯定是l==r
  107. printf("%d kbps\n",r);
  108.  
  109. }
  110. return ;
  111. }

uva11865 二分流量+最小生成树的更多相关文章

  1. [BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那 里的交通情况还是很糟糕.所以,OIER Association组 ...

  2. BZOJ2654: tree 二分答案+最小生成树

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

  3. [Poj2349]Arctic Network(二分,最小生成树)

    [Poj2349]Arctic Network Description 国防部(DND)要用无线网络连接北部几个哨所.两种不同的通信技术被用于建立网络:每一个哨所有一个无线电收发器,一些哨所将有一个卫 ...

  4. UVALive 4949 Risk(二分网络流、SAP)

    n个区域,每个区域有我方军队a[i],a[i]==0的区域表示敌方区域,输入邻接矩阵.问经过一次调兵,使得我方边界处(与敌军区域邻接的区域)士兵的最小值最大.输出该最大值.调兵从i->j仅当a[ ...

  5. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  6. BZOJ2654 tree

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

  7. ACRush 楼天成回忆录

    楼教主回忆录: 利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾.首先是 GCJ2006 的回忆. Google Code Jam 2006 一波三折: ...

  8. 楼天城楼教主的acm心路历程(作为励志用)

    楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...

  9. $HNOI\ 2010$ 解题报告

    HNOI 2010 解题报告 0. HNOI2010 AC代码包下载地址 注: 戳上面的标题中的'地址' 下载 代码包, 戳下面每一题的文件名 可进入 题目链接. 每一题 对应代码的文件名 我在 每一 ...

随机推荐

  1. Django REST Framework API Guide 02

    本节大纲 1.Generic Views 2.ViewSets  1.Generic Views CBV的主要的一个优点就是极大的允许了对于代码的从用.自然,rest framework取其优势,提供 ...

  2. JVM内存分配及GC流程

    -verbose 这是查询GC问题最常用的命令之一,具体参数如: -verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断. -verbose:gc 输 ...

  3. 【Java编程思想笔记】-集合1

    1.为什么要用集合? 一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式.但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来 ...

  4. 20165221—JAVA第六周学习心得

    课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...

  5. python 导入numpy 导致多进程绑定同一个CPU问题解决方法

    python 如果有导入numpy模块的import语句,会导致默认将多进程程序的每个进程都绑定到同一个CPU core上, 失去了多进程在多核CPU上的性能优越性,这和CPU affinity(CP ...

  6. Shell命令和技巧

    监控命令(每2秒运行一次) watch "ls -larth" 使用一个端口杀死程序 sudo fuser -k 8000/tcp 限制以下命令的内存使用 ulimit -Sv 1 ...

  7. mysqlfrm初步使用

    这个工具也就是读取frm文件生成建表语句默认的模式是再生个实例,使用--basedir选项或指定--server选项来连接到已经安装的实例.这种过程不会改变原始的.frm文件.该模式也需要指定--po ...

  8. Vue -cli 入门 --项目搭建(一)

    一. 安装node.js环境. 在node.js官网下载稳定版本(https://nodejs.org/en/) 下载完成后点击安装,安装过程很简单,一直next即可,安装完成会自动添加node及np ...

  9. [jquery]为jQuery.ajax添加onprogress事件

    原理: 给XMLHttpRequest对象的upload属性绑定onprogress方法监听上传过程 var xhr = new XMLHttpRequest();  xhr.upload.onpro ...

  10. Cocos2dx制作帧动画

    1.使用plist + png方式加载资源图,参数只需要plist路径 cc.SpriteFrameCache:getInstance()::addSpriteFrames("res/yk/ ...