BZOJ 3130: [Sdoi2013]费用流 网络流 二分 最大流
https://www.lydsy.com/JudgeOnline/problem.php?id=3130
本来找费用流的题,权当复习一下网络流好了。
有点麻烦的是double,干脆判断大小或者二分增加下限都用eps=1e-8操作好了(毕竟只要求精确到4位)。
我普通最大流都快忘了,板子写错了一次超时了。
网络流板子的细节要记清楚:1.增广的时候访问完哪个点就把dep标记改为-1防止同一次增广再次访问。2.往下层传递的时候用val-cnt而不是val。3.cnt=val时及时返回。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
const double eps=1e-;
int n,m,p;double mx;
struct nod{
int y,rev,next;double v,v1;
}e[maxn*];
int head[maxn]={},tot=;double Ans=;
int num[maxn]={},vis[maxn*]={};
queue<int>q;
void init(int x,int y,double v){
e[++tot].y=y;e[tot].v=v;e[tot].rev=tot+;e[tot].next=head[x];head[x]=tot;
e[++tot].y=x;e[tot].v=;e[tot].rev=tot-;e[tot].next=head[y];head[y]=tot;
}
bool fir(){
memset(num,-,sizeof(num));
q.push();num[]=;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next){
if(e[i].v1<eps)continue;
if(num[e[i].y]==-){
num[e[i].y]=num[x]+;
q.push(e[i].y);
}
}
}
return num[n]!=-;
}
double dfs(int x,double val){
if(x==n)return val;
double cnt=,z;
for(int i=head[x];i;i=e[i].next){
if((e[i].v1<eps)||num[e[i].y]!=num[x]+)continue;
z=dfs(e[i].y,min(val-cnt,e[i].v1));
cnt+=z; e[i].v1-=z; e[e[i].rev].v1+=z;
if(val-cnt<eps)return cnt;
}num[x]=-;
return cnt;
}
bool Check(double shu){
mx=shu;double cnt=;
for(int i=;i<tot;i+=)e[i].v1=min(mx,e[i].v);
for(int i=;i<=tot;i+=)e[i].v1=;
while(fir()){
cnt+=dfs(,);
}
return Ans-cnt<eps;
}
double erfen(double mx){
double l=,r=mx;
while(r-l>eps){
double mid=(l+r)/;
if(Check(mid))r=mid;
else l=mid+eps;
}
return l;
}
int main(){
scanf("%d%d%d",&n,&m,&p);
int x,y,z;
for(int i=;i<=m;i++){scanf("%d%d%d",&x,&y,&z);init(x,y,(double)z);mx=max(mx,(double)z);}
for(int i=;i<=tot;i++)e[i].v1=e[i].v;
while(fir())Ans+=dfs(,mx);
if(Ans==){
printf("0\n0.0000\n");
}
else{
printf("%.0f\n",Ans);
printf("%.4lf\n",erfen(mx)*(double)p);
}
return ;
}
BZOJ 3130: [Sdoi2013]费用流 网络流 二分 最大流的更多相关文章
- BZOJ 3130: [Sdoi2013]费用流 网络流+二分
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1230 Solved: ...
- bzoj 3130 [Sdoi2013]费用流(二分,最大流)
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...
- BZOJ 3130 [Sdoi2013]费用流 ——网络流
[题目分析] 很容易想到,可以把P放在流量最大的边上的时候最优. 所以二分网络流,判断什么时候可以达到最大流. 流量不一定是整数,所以需要实数二分,整数是会WA的. [代码] #include < ...
- bzoj 3130: [Sdoi2013]费用流
#include<cstdio> #include<iostream> #define M 10000 #define inf 0x7fffffff #include<c ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- 3130: [Sdoi2013]费用流
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络流方案 ...
- BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案
链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...
- BZOJ 2406: 矩阵 [上下界网络流 二分答案]
2406: 矩阵 题意:自己去看吧,最小化每行每列所有元素与给定矩阵差的和的绝对值中的最大值 又带绝对值又带max不方便直接求 显然可以二分这个最大值 然后判定问题,给定矩阵每行每列的范围和每个元素的 ...
- BZOJ 1305:dance跳舞(二分+最大流)
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
随机推荐
- C#反射-Assembly.Load、LoadFrom与LoadFile
反射Demo: public class Person { public int Age; public void SayHello() { Console.WriteLine("Hello ...
- [转]google gflags 库完全使用
简单介绍 gflags 是 google 开源的用于处理命令行参数的项目. 安装编译 项目主页:gflags ➜ ~ git clone https://github.com/gflags/gflag ...
- Interger不可变原理
1.先看代码: package main.java.db.mq; public class TestSwap { public static void main(String[] args) { In ...
- 如何扎实自己的Java基础?
问:如何扎实自己的Java基础? 答:玩好JDK JDK其实就是Java SE Development Kit的缩写,要玩好这东西可不简单.JDK主要包含了三部分,第一部分就是Java运行时环境,这其 ...
- linux下快速安装emacs方法
背景 在公司工作的时候经常需要在很多服务器之间切换,而公司的服务器上一般都没emacs,因此总结一下快速安装emacs的方法. 最简单的是直接使用yum安装,但是有两个问题,一个是有的生产服务器直接没 ...
- SQL Server 2000中查询表名,列名及字段类型
经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjec ...
- R语言学习笔记:使用reshape2包实现整合与重构
R语言中提供了许多用来整合和重塑数据的强大方法. 整合 aggregate 重塑 reshape 在整合数据时,往往将多组观测值替换为根据这些观测计算的描述统计量. 在重塑数据时,则会通过修改数据的结 ...
- 最邻近规则分类KNN算法
例子: 求未知电影属于什么类型: 算法介绍: 步骤: 为了判断未知实例的类别,以所有已知类别的实例作为参照 选择参数K 计算未知实例与所有已知实例的距离 选择最近K个已 ...
- centos7 PDI(Kettle)安装
kettle介绍 PDI(Kettle)是一种开源的 ETL 解决方案,书中介绍了如何使用PDI来实现数据的剖析.清洗.校验.抽取.转换.加载等各类常见的ETL类工作. 除了ODS/DW类比较大型的应 ...
- android拾遗——Android 动画学习笔记
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...