洛谷传送门

BZOJ传送门

题目描述

四川的方伯伯为了致富,决定引进海南的椰子树。方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统。

现在用点来表示交通节点,边来表示道路。这样,方伯伯的椰子园就可以看作一个有 n + 2 个交通节点,m条边的有向无环图。 n + 1 n +1 n+1 号点为入口, n + 2 n+2 n+2 号点为出口。每条道路都有 6 6 6 个参数, u i u_i ui​, v i v_i vi​, a i a_i ai​, b i b_i bi​, c i c_i ci​, d i d_i di​,分别表示,该道路从 u i u_i ui​ 号点通向 v i v_i vi​ 号点,将它的容量压缩一次要 a i a_i ai​ 的花费,容量扩大一次要 b i b_i bi​ 的花费,该条道路当前的运输容量上限为 c i c_i ci​,并且每单位运输量通过该道路要 d i d_i di​ 的费用。

在这个交通网络中,只有一条道路与起点相连。因为弄坏了这条道路就会导致整个交通网络瘫痪,聪明的方伯伯决定绝不对这条道路进行调整,也就是说,现在除了这条道路之外,对其余道路都可以进行调整。

有两种调整方式:

  1. 选择一条道路,将其进行一次压缩,这条道路的容量会下降 1 1 1 单位。
  2. 选择一条道路,将其进行一次扩容,这条道路的容量会上升 1 1 1 单位。

一条道路可以被多次调整。

由于很久以前,方伯伯就请过一个工程师,对这个交通网络进行过一次大的优化调整。所以现在所有的道路都被完全的利用起来了,即每条道路的负荷都是满的(每条道路的流量等于其容量)。

但方伯伯一想到自己的海南椰子会大丰收,就十分担心巨大的运输量下,会导致过多的花费。因此,方伯伯决定至少进行一次调整,调整之后,必须要保持每条道路满负荷,且总交通量不会减少。

设调整后的总费用是 Y Y Y,调整之前的总费用是 X X X。现在方伯伯想知道,最优调整比率是多少,即假设他进行了 k k k 次调整, X − Y k \frac{X - Y}{k} kX−Y​最大能是多少?

注:总费用 = = = 交通网络的运输花费 + 调整的花费

输入输出格式

输入格式:

第一行包含二个整数 N N N, M M M接下来 M M M行代表 M M M条边,表示这个交通网络每行六个整数,表示 U i , V i , A i , B i , C i , D i U_i,V_i,A_i,B_i,C_i,D_i Ui​,Vi​,Ai​,Bi​,Ci​,Di​接下来一行包含一条边,表示连接起点的边

输出格式:

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

输入输出样例

输入样例#1:

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

输出样例#1:

103.00

说明

1 ≤ N ≤ 5000 , 0 ≤ M ≤ 3000 , 1 ≤ U i , V i ≤ N + 2 , 0 ≤ A i , B i ≤ 500 , 0 ≤ C i ≤ 10000 , 0 ≤ D i ≤ 1000 1\leq N\leq 5000, 0\leq M\leq 3000, 1\leq Ui,Vi\leq N+2, 0\leq Ai,Bi\leq 500, 0\leq Ci\leq 10000, 0\leq Di\leq 1000 1≤N≤5000,0≤M≤3000,1≤Ui,Vi≤N+2,0≤Ai,Bi≤500,0≤Ci≤10000,0≤Di≤1000

解题分析

看题目所求, 显然是一道分数规划, 然而我们应该如何构图?

假设原来 D A G DAG DAG的一部分是这个样子的:

如果我们要将一部分道路的流量缩小(例如上图靠左的一半路径), 并保证所有边仍然满流, 那么肯定会将这些路径的流量都 − 1 -1 −1,其他部分的边的流量 + 1 +1 +1。具体而言会变成这样:

显然就形成了一个环。 那么我们单位流量沿着红色边走的代价就是 a − d a-d a−d(因为相当于减少了流量),沿着绿色边走的代价就是 b + d b+d b+d。

我们设 a n s = m a x { X − Y k } ans=max\{\frac{X-Y}{k} \} ans=max{kX−Y​}, 那么对于图中的任何一个环都有 a n s × k ≥ X − Y ans\times k\ge X-Y ans×k≥X−Y(在这里 X − Y X-Y X−Y就是如上图所示环中原来的边与红色边和绿色边代价和的差)。 因为我们是求一个最值, 所以我们只需要关心单位流量的情况, 即只要 c ≠ 0 c\neq 0 c̸​=0即可从 v v v向 u u u连边。

考虑如何将 a n s × k ans\times k ans×k带入计算。 我们发现环中其实就有 k k k个点, 那么二分 a n s ans ans, 把对应的边权加上 a n s ans ans就好。如果跑 S P F A SPFA SPFA时仍然有负环, 那么仍然满足要求, 可以提升二分下界, 否则降低上界。

另外, 注意图中共有 n + 2 n+2 n+2个点! 否则会 W A WA WA到天边…

代码如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <cmath>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MX 5050
#define db double
#define ll long long
#define EPS 1e-3
template <class T>
IN void in(T &x)
{x = 0; R char c = gc;for (; !isdigit(c); c = gc);for (;  isdigit(c); c = gc)x = (x << 1) + (x << 3) + c - 48;
}
int dot, line, cnt;
int head[MX];
db dis[MX];
bool vis[MX];
struct Edge {int to, len, nex;} edge[MX << 3];
IN void add(R int from, R int to, R int len)
{edge[++cnt] = {to, len, head[from]}, head[from] = cnt;}
bool SPFA(R int now, db tar)
{vis[now] = true;for (R int i = head[now]; i; i = edge[i].nex){if(dis[edge[i].to] > dis[now] + edge[i].len + tar){dis[edge[i].to] = dis[now] + edge[i].len + tar;if(vis[edge[i].to]) return true;if(SPFA(edge[i].to, tar)) return vis[now] = false, true;}}return vis[now] = false;
}
IN bool check(db tar)
{std::memset(vis, false, sizeof(vis));std::memset(dis, 0, sizeof(dis));for (R int i = 1; i <= dot; ++i)if(SPFA(i, tar)) return true;return false;
}
IN void solve()
{db lef = 0, rig = 1e8, mid;W(rig - lef > EPS){mid = (lef + rig) / 2;if(check(mid)) lef = mid;else rig = mid;}printf("%.2lf", mid);
}
int main(void)
{int u, v, a, b, c, d;in(dot), in(line); dot += 2;for (R int i = 1; i <= line; ++i){in(u), in(v), in(a), in(b), in(c), in(d);if(c) add(v, u, a - d);add(u, v, b + d);}solve();
}

[Luogu P3288] [BZOJ 3597] [SCOI2014]方伯伯运椰子相关推荐

  1. BZOJ 3597 [Scoi2014]方伯伯运椰子

    01分数规划+判负环 看到分数就直接上分数规划嘛--瞎推一下式子就行了.不知道什么是分数规划就去看胡学长论文啦. 一不小心忘记睡觉了.好困啊,把from打成flow差点没看出来--感觉身体被掏空,明天 ...

  2. 3597: [Scoi2014]方伯伯运椰子

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

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

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

  4. [bzoj3597][SCOI2014]方伯伯运椰子

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MB Submit: 353 Solved: 215 [Submit][Statu ...

  5. bzoj3597: [Scoi2014]方伯伯运椰子【分数规划+费用流】

    Description 四川的方伯伯为了致富,决定引进海南的椰子树. 方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统. 现在用点来表示交通节点,边来表示道路.这样,方伯伯的椰子园就可以看作一个 ...

  6. SCOI2014方伯伯运椰子 (分数规划+SPFA)

    题目描述 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统. 现在用点来表示交通节点,边来表示道路.这样,方伯伯的椰子园就可以看作一个有 n + 2 ...

  7. BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】

    题目链接 BZOJ3597 题解 orz一眼过去一点思路都没有 既然是流量网络,就要借鉴网络流的思想了 我们先处理一下那个比值,显然是一个分数规划,我们二分一个\(\lambda = \frac{X ...

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

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

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

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

最新文章

  1. Gitea 1.7.6 发布,一键部署的自助 Git 服务
  2. ajax异步请求验证ua的网页,ajax 异步请求数据
  3. 【外贸人必看骗术】和中东客户做生意
  4. 计算机桌面图标有背影,桌面图标有背影怎么解决
  5. Spring Session实战4
  6. 编程之美 求数组中的最长递增子序列
  7. 编程体系结构(08):Spring.Mvc.Boot框架
  8. 火爆全网的迁移学习简明手册全面更新,重磅出版上市!
  9. 在CKEditor中创建自己的命令按钮
  10. 存到mysql的中文乱码_web项目存数据到数据库,中文乱码,解决过程
  11. Atitit. atiOrder   Order 订单管理框架的设计
  12. GB/T 35273—2020《信息安全技术个人信息安全规范》正式发布
  13. Win10+Ubuntu+Deepin+macOS+PhoenixOS+FydeOS+centOS+openSUSE+Kylin+ChromeOS+RedFlag等多系统安装(包含rEFind引导)
  14. 发现了个神奇的图片压缩工具
  15. web前端程序员真的值这么多钱吗?
  16. 程序员专属段子集锦 10/10
  17. Qt实现屏幕中间显示小点,打游戏瞬狙,你还在屏幕中间贴红点吗?
  18. C/C++中的atan和atan2函数
  19. 前端基础-TCP/IP 不完全详解
  20. vim 文本编辑器 基本操作

热门文章

  1. xrdp协议_远程桌面协议-阿里云开发者社区
  2. java modbus tcp_modbus tcp 入门详解
  3. C# modbus TCP协议应用
  4. Android 个性化控件整理
  5. mysql 根据查询结果集更新数据
  6. 学习笔记之CentOS启动故障解决方法
  7. Spring MethodInvoker学习笔记
  8. key筛选 redis_利用redis实现多属性快速查询
  9. 怎样呵护友谊_呵护友谊作文
  10. GBase8数据库备份和恢复