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代码包下载地址 注: 戳上面的标题中的'地址' 下载 代码包, 戳下面每一题的文件名 可进入 题目链接. 每一题 对应代码的文件名 我在 每一 ...
随机推荐
- AngularJS--及其他js框架对比
----和 **类似?? Angular 2.谷歌的 React Facebook的 Vue.js. Ember.js. https://github.com/angular/angular.js ...
- Java开发环境配置(1)--tool准备
工具准备:1.eclipse-mars开发工具必须安装 2.XAMPP-环境集成了MYSQL,APACHE,TOMCAT建议安装 3.TOMCAT提供了二个版本(8.0和9.0),建议安装一个以备不时 ...
- Css - 页面标签页图标
Css - 页面标签页图标 <head> <meta charset="utf-8" /> <title>京东(JD.COM)- ...
- 51nod 1294 修改数组
若a[i]-i(i从1开始)的值小于0,那么a[i]必须改变 若a[i]-i的值大于等于0,将a[i]-i存入新的数组中,求出新数组的最长非严格上升子序列,所得即最多的,不用改变的数. #includ ...
- C++ 引用变量
int rats; int & rodents = rats; rats 和 rodents 可以互换,他们指向相同的值和内存单元.其实就是给rats取了别名rodents. 修改其中任意一个 ...
- Django实战(一)-----用户登录与注册系统5(图片验证码)
为了防止机器人频繁登录网站或者破坏分子恶意登录,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是一种区分用户是计算机还是人的公共全自动程序. 可以防止恶意破解密码.刷票.论坛 ...
- mybatis resultType resultMap 区别
resultType 就是返回的类型 resultMap 返回的是一个结果集,这个结果集一般是用过resultMap节点来配置的,相应的type一般是一个Model. https://blog.csd ...
- Android AlertDialog 绝对位置计算
public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle save ...
- go 多维度 Map 的数据存取
多维度 Map 的数据存取 一维情况下的 map 做存取很简单,而二维以上的情况就得小心了. 先来看一个例子: m:=make(map[string]map[string]int) c:=make ...
- thinkphp提示不支持mysqli或者mysql
确认php是否安装了php-mysql组件,nginx或apache的php服务进程