uva11865 二分流量+最小生成树
uva好题真多
本题用二分法找flow,把流量小于flow的全部筛掉,剩下的边建立最小树形图,如果权值大于c或者不能建图,那么修改二分边界
上代码,觉得最小树形图的代码很优美
- /*
- 题意:给定n个点,m条边,c块钱
- m条单向边 带有流量,并且会消耗一些钱
- 问怎么建立最大流量图
- 二分流量,找到流量最大的能使消费低于c的方案
- 在朱刘算法时筛掉所有流量小于当前流量的网络边
- */
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #define MAXN 10005
- #define INF 0x3f3f3f3f
- #define ll long long
- using namespace std;
- struct Node{
- int u,v,cost;
- }e[MAXN];
- int pre[MAXN],id[MAXN],vis[MAXN];
- ll in[MAXN];
- ll zhuliu(int root,int n,int m){
- ll res=;
- while(){
- for(int i=;i<n;i++) in[i]=INF;
- for(int i=;i<m;i++)
- if(e[i].u!=e[i].v && e[i].cost<in[e[i].v]){
- pre[e[i].v]=e[i].u;
- in[e[i].v]=e[i].cost;
- }
- for(int i=;i<n;i++)
- if(i!=root && in[i]==INF) return -;
- int tn=;
- memset(id,-,sizeof id);
- memset(vis,-,sizeof vis);
- in[root]=;
- for(int i=;i<n;i++){
- res+=in[i];
- int v=i;
- while(v!=root && id[v]==- && vis[v]!=i){
- vis[v]=i;
- v=pre[v];
- }
- if(id[v]==- && v!=root){
- for(int u=pre[v];u!=v;u=pre[u])
- id[u]=tn;
- id[v]=tn++;
- }
- }
- if(tn==) break;
- for(int i=;i<n;i++)
- if(id[i]==-) id[i]=tn++;
- for(int i=;i<m;i++){
- int v=e[i].v;
- e[i].u=id[e[i].u];
- e[i].v=id[e[i].v];
- if(e[i].u!=e[i].v)
- e[i].cost-=in[v];
- }
- n=tn;
- root=id[root];
- }
- return res;
- }
- struct Edge{
- int u,v,cost;
- int flow; //网络的最大带宽
- }edge[MAXN];
- int judge(int flow,int n,int m,ll c){
- int totm=;//筛选边
- for(int i=;i<m;i++)
- if(flow<=edge[i].flow){
- e[totm].u=edge[i].u;
- e[totm].v=edge[i].v;
- e[totm++].cost=edge[i].cost;
- }
- int root=;
- int res=zhuliu(root,n,totm);
- if(res==- || res>c) return ;
- else return ;
- }
- int main(){
- int T,n,m;
- ll c;
- cin >> T;
- while(T--){
- scanf("%d%d%lld",&n,&m,&c);
- int l=,r=,mid;
- for(int i=;i<m;i++){//先输入所有边
- scanf("%d%d%d%d",&edge[i].u,&edge[i].v,&edge[i].flow,&edge[i].cost);
- l=min(l,edge[i].flow);
- r=max(r,edge[i].flow);
- }
- if(!judge(l,n,m,c)){
- printf("streaming not possible.\n");
- continue;
- }
- while(l<r){
- mid = l+(r-l+)/;
- if(judge(mid,n,m,c))//mid流量可以联通
- l=mid;
- else //无法联通,说明流量开大了
- r=mid-;
- }
- //二分到最后肯定是l==r
- printf("%d kbps\n",r);
- }
- return ;
- }
uva11865 二分流量+最小生成树的更多相关文章
- [BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树
Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那 里的交通情况还是很糟糕.所以,OIER Association组 ...
- BZOJ2654: tree 二分答案+最小生成树
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- [Poj2349]Arctic Network(二分,最小生成树)
[Poj2349]Arctic Network Description 国防部(DND)要用无线网络连接北部几个哨所.两种不同的通信技术被用于建立网络:每一个哨所有一个无线电收发器,一些哨所将有一个卫 ...
- UVALive 4949 Risk(二分网络流、SAP)
n个区域,每个区域有我方军队a[i],a[i]==0的区域表示敌方区域,输入邻接矩阵.问经过一次调兵,使得我方边界处(与敌军区域邻接的区域)士兵的最小值最大.输出该最大值.调兵从i->j仅当a[ ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- BZOJ2654 tree
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- ACRush 楼天成回忆录
楼教主回忆录: 利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾.首先是 GCJ2006 的回忆. Google Code Jam 2006 一波三折: ...
- 楼天城楼教主的acm心路历程(作为励志用)
楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...
- $HNOI\ 2010$ 解题报告
HNOI 2010 解题报告 0. HNOI2010 AC代码包下载地址 注: 戳上面的标题中的'地址' 下载 代码包, 戳下面每一题的文件名 可进入 题目链接. 每一题 对应代码的文件名 我在 每一 ...
随机推荐
- Django REST Framework API Guide 02
本节大纲 1.Generic Views 2.ViewSets 1.Generic Views CBV的主要的一个优点就是极大的允许了对于代码的从用.自然,rest framework取其优势,提供 ...
- JVM内存分配及GC流程
-verbose 这是查询GC问题最常用的命令之一,具体参数如: -verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断. -verbose:gc 输 ...
- 【Java编程思想笔记】-集合1
1.为什么要用集合? 一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式.但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来 ...
- 20165221—JAVA第六周学习心得
课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...
- python 导入numpy 导致多进程绑定同一个CPU问题解决方法
python 如果有导入numpy模块的import语句,会导致默认将多进程程序的每个进程都绑定到同一个CPU core上, 失去了多进程在多核CPU上的性能优越性,这和CPU affinity(CP ...
- Shell命令和技巧
监控命令(每2秒运行一次) watch "ls -larth" 使用一个端口杀死程序 sudo fuser -k 8000/tcp 限制以下命令的内存使用 ulimit -Sv 1 ...
- mysqlfrm初步使用
这个工具也就是读取frm文件生成建表语句默认的模式是再生个实例,使用--basedir选项或指定--server选项来连接到已经安装的实例.这种过程不会改变原始的.frm文件.该模式也需要指定--po ...
- Vue -cli 入门 --项目搭建(一)
一. 安装node.js环境. 在node.js官网下载稳定版本(https://nodejs.org/en/) 下载完成后点击安装,安装过程很简单,一直next即可,安装完成会自动添加node及np ...
- [jquery]为jQuery.ajax添加onprogress事件
原理: 给XMLHttpRequest对象的upload属性绑定onprogress方法监听上传过程 var xhr = new XMLHttpRequest(); xhr.upload.onpro ...
- Cocos2dx制作帧动画
1.使用plist + png方式加载资源图,参数只需要plist路径 cc.SpriteFrameCache:getInstance()::addSpriteFrames("res/yk/ ...