题目链接

BZOJ3597

题解

orz一眼过去一点思路都没有

既然是流量网络,就要借鉴网络流的思想了

我们先处理一下那个比值,显然是一个分数规划,我们二分一个\(\lambda = \frac{X - Y}{k}\)

如果\(\lambda\)成立,则

\[\lambda \le \frac{X - Y}{k}
\]

\[\lambda k + (Y - X) \le 0
\]

所以我们只需要判断是否存在一种方案使得这个式子成立

依照网络流的思想,撤回流量就往反向边走,扩展流量往正向边

对于边\((u,v)\),撤回流量产生的代价就是\(\lambda + \Delta fee = \lambda + (ai - di)\)

扩展产生的代价就是\(\lambda + \Delta fee = \lambda + (bi + di)\)

为保证流量守恒,我们调整边走过的路径必须成环

如果我们建出的图中存在权值为负的环,就找到了一条满足上式的调整方案

使用\(spfa\)判负环即可

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. #define eps 1e-4
  14. using namespace std;
  15. const int maxn = 5005,maxm = 10005,INF = 1000000000;
  16. inline int read(){
  17. int out = 0,flag = 1; char c = getchar();
  18. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  19. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  20. return out * flag;
  21. }
  22. int h[maxn],ne;
  23. struct EDGE{int to,nxt; double w;}ed[maxm];
  24. inline void build(int u,int v,double w){
  25. ed[++ne] = (EDGE){v,h[u],w}; h[u] = ne;
  26. }
  27. int n,m,vis[maxn];
  28. double d[maxn];
  29. bool spfa(int u,double lam){
  30. vis[u] = true;
  31. Redge(u){
  32. to = ed[k].to;
  33. if (d[to] > d[u] + ed[k].w + lam){
  34. d[to] = d[u] + ed[k].w + lam;
  35. if (vis[to]) return true;
  36. if (spfa(to,lam)) return true;
  37. }
  38. }
  39. vis[u] = false;
  40. return false;
  41. }
  42. bool check(double lam){
  43. cls(vis); cls(d);
  44. for (int i = 1; i <= n; i++) if (spfa(i,lam)) return true;
  45. return false;
  46. }
  47. int main(){
  48. n = read() + 2; m = read();
  49. int u,v,a,b,c,d;
  50. for (int i = 1; i <= m; i++){
  51. u = read(); v = read(); a = read(); b = read(); c = read(); d = read();
  52. if (u == n - 1 || v == n - 1) continue;
  53. if (c) build(v,u,a - d);
  54. build(u,v,d + b);
  55. }
  56. double l = 0,r = 1000000000,mid;
  57. while (r - l > eps){
  58. mid = (l + r) / 2.0;
  59. if (check(mid)) l = mid;
  60. else r = mid;
  61. }
  62. printf("%.2lf",(l + r) / 2.0);
  63. return 0;
  64. }

BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】的更多相关文章

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

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

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

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

  3. [bzoj3597][scoi2014]方伯伯运椰子——分数规划,负环

    题解 目标就是 \[Maximize\ \lambda = \frac{X-Y}{k}\] 按照分数规划的一般规律, 构造: \[g(\lambda) = \lambda k + Y - X\] 由于 ...

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

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

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

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

  6. 【BZOJ3597】方伯伯运椰子(分数规划,网络流)

    [BZOJ3597]方伯伯运椰子(分数规划,网络流) 题解 给定了一个满流的费用流模型 如果要修改一条边,那么就必须满足流量平衡 也就是会修改一条某两点之间的路径上的所有边 同时还有另外一条路径会进行 ...

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

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

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

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

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

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

随机推荐

  1. ECMAscript6(ES6)新特性语法总结(一)

    ES6/ES2015,,在ES5的基础上扩展了很多新的功能,在使用的时候要慎重,因为有一部分js代码在部分浏览器是不兼容的,但是所有写在服务器端的代码基本上都支持ES6的写法. 新特性: 一.开启严格 ...

  2. Struts2基础入门

    Struts2基础入门 创建一个web工程 0)导包并且创建一个核心配置文件 <?xml version="1.0" encoding="UTF-8"?& ...

  3. java的八种基本数据类型

             据说表格的方式一目了然 一. java数据类型的取值范围如下: 注意:long型后如果不加 L 则默认为int型,float型如果不加 F 则默认为double型: 注意!注意!注意 ...

  4. mysql 创建用户、授权、修改密码

    以下操作都要在mysql所在机器操作 一.创建用户 CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; 或 insert into mysql. ...

  5. JQuery制作网页—— 第三章 JavaScript操作DOM对象

    1. DOM:Document Object Model(文档对象模型):          DOM操作:                   ●DOM是Document Object Model的缩 ...

  6. TFS 2015服务端安装与客户端签入项目步骤

    一.参考如下3篇文章搭建TFS2015环境 1.参考文章如下: TFS 2015(Visual Studio Team Foundation Server)的下载和安装http://www.cnblo ...

  7. Google Compute Engine VM自动调节

    现象:利用google云搭建VM服务,在搭建实例组有一个"自动调节"功能,可以自动添加/删除MV,当自动添加VM时可能新添加的VM就是一个新的VM,你部署的代码或者环境都没了.现在 ...

  8. Linux编译移植Qt5的环境_Xillinx的ZYNQ平台

    Linux编译Qt环境 2017年的十一假期,足不出户,一个人在教研室里面搞Qt的移植.我手里面有Samsung的CortexA8,Samsung的 CortexA53还有Ti的Sitara系列的AM ...

  9. iOS-UICollectionViewController 介绍

    废话不多说,列几个列子 (几种情况下的做法): 情景一: 介绍:1. 在UIViewController 上加 UICollectionView (用代码 创建 UICollectionView). ...

  10. caioj:1348: [NOIP普及组2012]质因数分解 C++

    题目描述 已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入样例 21 输出样例 7 输入 输入只有一行,包含一个正整数n. 输出 输出只有一行,包含一个正整数p,即较大的那个质数 ...