Description

Input

第一行包含二个整数N,M

接下来M行代表M条边,表示这个交通网络
每行六个整数,表示Ui,Vi,Ai,Bi,Ci,Di
接下来一行包含一条边,表示连接起点的边

Output

一个浮点数,保留二位小数。表示答案,数据保证答案大于0

Sample Input

5 10
1 5 13 13 0 412
2 5 30 18 396 148
1 5 33 31 0 39
4 5 22 4 0 786
4 5 13 32 0 561
4 5 3 48 0 460
2 5 32 47 604 258
5 7 44 37 75 164
5 7 34 50 925 441
6 2 26 38 1000 22

Sample Output

103.00

HINT

1<=N<=5000

0<=M<=3000
 
1<=Ui,Vi<=N+2
0<=Ai,Bi<=500
0<=Ci<=10000
0<=Di<=1000
 
很久之前就想做这道题了...
上午叶大佬给我看了APIO2017 T3后,特别想找一道0/1分数规划打一打
这个题首先分数规划的思路是比较显然的...设答案为mid,wi为一次操作的贡献,n为次数;
X-Y>=mid*n;
X-(X+∑wi)>=mid*n=mid*∑1;
X-(X+∑wi+mid)>=0;
∑wi+mid<=0;
那么我们就是需要判断∑wi+mid的最小值<=0;
首先可以很好的知道缩一条边的贡献是ai-di,扩大一条边的贡献是bi+di;
但是我们必须满足流量不变且每条边满载,
然后我发现修改一条边是牵一发而动全身的,为了一条边需要修改一连串的边且要一直到起点出来的那条边.
然后就觉得很完蛋...其实好像可以用判负圈那套理论...
于是在网上看到了一种很有道理的想法.是一种基于调整的思路.
假设先把所有的道路压缩为0,那么初始费用为:∑(ai-di+mid)*ci;
然后用费用流进行调整:
对于原图中的每条边进行两种调整:
1.连容量为c,费用为-(ai-di+mid)的边;
2.连容量为Inf,费用为(bi+di+mid)的边;(从起点出发的不连)
对于第一种边表示撤回原来的压缩操作,对于第二种边表示进行扩大操作.
 
这样做的正确性:
1.由于是最小费用最大流所以会优先增广第一种费用小的边,所以一定是把所有压缩操作撤回了,再考虑扩大操作的
2.由于是最小费用最大流,所以新图的最大流和原图相等,流量平衡了
妙不可言
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define RG register
using namespace std;
const int N=100000;
const int Inf=19260817;
const double eps=1e-5;
int head[N],nxt[N],to[N],s[N],fa[N],cnt=1,n,m,S,T,tt;
int w[N],ti[N],vis[N],q[N*10];
double c[N],dis[N],cost,ans;
struct data{
int u,v,a,b,c,d;
}a[N];
inline void Addedge(RG int x,RG int y,RG int z,RG double v){
to[++cnt]=y,nxt[cnt]=head[x],s[cnt]=z,c[cnt]=v,head[x]=cnt;
}
inline void lnk(RG int x,RG int y,RG int z,RG double v){
Addedge(x,y,z,v);Addedge(y,x,0,-v);
}
inline bool spfa(){
for(RG int i=1;i<=T;i++) vis[i]=0,dis[i]=Inf;
int t=0,sum=1;q[0]=S,vis[S]=1,dis[S]=0;
while(t<sum){
int now=q[t++];vis[now]=0;
for(RG int i=head[now];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[now]+c[i]&&s[i]){
fa[y]=i;dis[y]=dis[now]+c[i];
if(!vis[y]) vis[y]=1,q[sum++]=y;
}
}
}
if(abs(dis[T]-Inf)<=eps) return 0;
int f=Inf;
for(RG int i=fa[T];i;i=fa[to[i^1]]) f=min(f,s[i]);
for(RG int i=fa[T];i;i=fa[to[i^1]]) s[i]-=f,s[i^1]+=f;
cost+=dis[T]*f;
return 1;
}
void rebuild(double mid){
memset(head,0,sizeof(head));cnt=1;
for(int i=1;i<=m;i++){
lnk(a[i].u,a[i].v,a[i].c,-(-a[i].d+a[i].a+mid));
if(a[i].u!=S) lnk(a[i].u,a[i].v,Inf,a[i].b+a[i].d+mid);
}
}
bool check(double mid){
rebuild(mid);double ret=0;cost=0;
for(int i=1;i<=m;i++){
ret+=(-a[i].d+a[i].a+mid)*a[i].c;
}
while(spfa());
return 0-(ret+cost)>=eps;
}
int main(){
scanf("%d%d",&n,&m);S=n+1,T=n+2;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d%d%d",&a[i].u,&a[i].v,&a[i].a,&a[i].b,&a[i].c,&a[i].d);
}
double l=0,r=30000.0;
while(r-l>=eps){
double mid=(l+r)/2;
if(check(mid)) ans=mid,l=mid;
else r=mid;
}
printf("%.2f",ans);
return 0;
}
 

bzoj 3597: [Scoi2014]方伯伯运椰子的更多相关文章

  1. bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 144  Solved: 78[Submit][Status ...

  2. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

  3. bzoj 3597 [Scoi2014] 方伯伯运椰子 - 费用流 - 二分答案

    题目传送门 传送门 题目大意 给定一个费用流,每条边有一个初始流量$c_i$和单位流量费用$d_i$,增加一条边的1单位的流量需要花费$b_i$的代价而减少一条边的1单位的流量需要花费$a_i$的代价 ...

  4. 3597: [Scoi2014]方伯伯运椰子[分数规划]

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 404  Solved: 249 [Submit][Sta ...

  5. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3597 Description 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十 ...

  6. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 360[Submit][Statu ...

  7. 2019.03.28 bzoj3597: [Scoi2014]方伯伯运椰子(01分数规划)

    传送门 题意咕咕咕有点麻烦不想写 思路: 考虑加了多少一定要压缩多少,这样可以改造边. 于是可以通过分数规划+spfaspfaspfa解决. 代码: #include<bits/stdc++.h ...

  8. BZOJ3597 SCOI2014方伯伯运椰子(分数规划+spfa)

    即在总流量不变的情况下调整每条边的流量.显然先二分答案变为求最小费用.容易想到直接流量清空跑费用流,但复杂度略有些高. 首先需要知道(不知道也行?)一种平时基本不用的求最小费用流的算法——消圈法.算法 ...

  9. Bzoj3597: [Scoi2014]方伯伯运椰子

    题面 传送门 Sol 消圈定理:如果一个费用流网络的残量网络有负环,那么这个费用流不优 于是这个题就可以建出残量网络,然后分数规划跑负环了 # include <bits/stdc++.h> ...

随机推荐

  1. 第六届蓝桥杯软件类省赛题解C++/Java

    第六届蓝桥杯软件类省赛题解C++/Java 1[C++].统计不含4的数字统计10000至99999中,不包含4的数值个数.答:暴力循环范围内所有数字判断一下就是了,答案是52488 1[Java]. ...

  2. 非一屏页面,出现遮罩层页面位置不动,并且遮罩层一屏显示。(pc,移动端都适用的方法)

    首先展示页面效果: 遮罩没出现的页面张酱紫:页面在楼层二这个位置. 遮罩显示:后面页面页面任停留在当前浏览位置,滚动条并未回顶部 下面来说说写法: css: 页面具体布局样式......(此处省略无数 ...

  3. 第十一章 泛型算法 C++ PRIMER

    vector<int>::const_iterator result = find(vector.begin(). vector.end(),search_value); 如果查找失败,分 ...

  4. Nginx配置优化及深入讲解,大家可以听一下

    随着访问量的不断增加,需要对Nginx和内核做相应的优化来满足高并发用户的访问,那下面在单台Nginx服务器来优化相关参数. 1)       Nginx.conf配置优化: worker_proce ...

  5. 深入研究-webkit-overflow-scrolling:touch及ios滚动

    1. -webkit-overflow-scrolling:touch是什么? MDN上是这样定义的: -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效 ...

  6. jquery写的树状列表插件-alvintree

    在做项目的时候遇到选择部门下人员的功能,可多选可单选,所以就想着使用树状列表来进行选择,但在网上找了很多,发现要么就是挺复杂,要么就是需要各种前端框架的支持,试了一个感觉难用,所以就想着自己写一个简便 ...

  7. .9-浅析webpack源码之NodeEnvironmentPlugin模块总览

    介绍Compiler的构造比较无趣,不如先过后面的,在用到compiler的时候再做讲解. 这一节主要讲这行代码: // 不管这里 compiler = new Compiler(); compile ...

  8. python re 正则匹配 split sub

    import re 编译: motif='([ST])Q' seq="SQAAAATQ" regrex=re.compile(motif) #编译成正则对象 regrex=re.c ...

  9. TCP的十一种状态与三次握手分析(有图)

    我们知道TCP是面向连接的,我们只知道有连接断开,其实内部还有一些比较复杂的状态.去了解各个状态之间的切换有助于我们更加深入的了解TCP.下面我们就来分析各个状态. 1.如下图示(图源百度)图中显示出 ...

  10. 解决EJB本地调用“java.lang.ClassCastException: $Proxy96 cannot be cast to com.tgb.ejb.UserManager”异常

    EJB本地调用方式:把Webclient和EJB服务端部署到同一个JBoss,client和server通过一个JVM进行通信. Web客户端本地调用时.需引用EJB服务端打包的jar,不需引用JBo ...