让我再讲一个故事吧。

又有一些小精灵要准备从银月城(S)迁徙到Nibel山(T)。

这两个地方之间的道路构成了一个网络。

每个道路都有它自己的容量,这决定了每天有多少小精灵可以同时从这儿通过。

和上一篇不同的是,由于上次迁徙的规模很大,

吸引了其它一些种族的注意,

这次每条道路都会有一些人/兽人/哥布林/...向精灵们征收过路费,

现在精灵们想知道,在花费最小的情况下,它们迁徙的速度最大是多少只每天。

费用流=最小费用最大

在要求流最大的情况下要求费用最小,好像原来的isap已经派不上用场了呢!

让我们回到最朴实的EK算法上。

EK算法每一次只寻找一条增广路,

这带给它解决这一个方面的问题的得天独厚的优势。

这是原来的EK伪算法:

  1. int BFS()
  2. {
  3. /*找到一条增广路*/
  4. }
  5. int ek()
  6. {
  7. /*对找到的增广路进行一系列处理*/
  8. }

我们用BFS找增广路。

想象一下,

既然要求费用最小

我们就把费用作为路径长度

之后每一次跑一遍最短路

那么就可以保证花费最小了!


所以,我们只要把原来的BFS()改成spfa()或者dijkstra()就好啦

  1. ps.一般dijkstra只能跑不带负权边的图,
  2. 但是有一种特殊的技巧可以把边权魔改成正的。

以下是拿辣鸡spfa跑的费用流

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int,int> pii;
  4. #define mp(a,b) make_pair(a,b)
  5. #define ll first
  6. #define rr second
  7. inline int gotcha()
  8. {
  9. register int a=0,b=1,c=getchar();
  10. while(!isdigit(c))b^=a=='-',c=getchar();
  11. while(isdigit(c))a=a*10+c-48,c=getchar();
  12. return b?a:-a;
  13. }
  14. const int _ = 5002 , __ = 50002<<1 , inf = 0x3f3f3f3f;
  15. int to[__],ne[__],v[__],co[__],he[__]={0},ecnt=1;
  16. int n,m,dis[_],pe[_],pv[_],S,T;
  17. bool ed[_];
  18. void adde(int a,int b,int c,int d){to[++ecnt]=b,v[ecnt]=c,co[ecnt]=d,ne[ecnt]=he[a],he[a]=ecnt;}
  19. queue<int> q;
  20. int spfa()
  21. {
  22. memset(dis,63,sizeof(dis)),memset(ed,0,sizeof(ed));
  23. while(!q.empty())q.pop();
  24. register int i,a;
  25. q.push(S),ed[S]=1,dis[S]=0;
  26. while(!q.empty())
  27. {
  28. a=q.front(),q.pop();ed[a]=0;
  29. for(i=he[a];i;i=ne[i])
  30. if(v[i]>0 && dis[to[i]]>dis[a]+co[i])
  31. {
  32. dis[to[i]]=dis[a]+co[i];
  33. pe[to[i]]=i,pv[to[i]]=a;
  34. if(!ed[to[i]])ed[to[i]]=1,q.push(to[i]);
  35. }
  36. }
  37. return dis[T]<inf;
  38. }
  39. pii mfmc()
  40. {
  41. register int i,sco=0,sfl=0,flw;
  42. while(spfa())
  43. {
  44. flw=inf;
  45. for(i=T;i!=S;i=pv[i])flw=min(flw,v[pe[i]]);
  46. for(i=T;i!=S;i=pv[i])v[pe[i]]-=flw,v[pe[i]^1]+=flw;
  47. sco+=flw*dis[T],sfl+=flw;
  48. }
  49. return mp(sfl,sco);
  50. }
  51. int main()
  52. {
  53. register int i,j,k,a,b;
  54. register pii tmp;
  55. n=gotcha(),m=gotcha(),S=gotcha(),T=gotcha();
  56. for(i=1;i<=m;i++)
  57. {
  58. j=gotcha(),k=gotcha(),a=gotcha(),b=gotcha();
  59. adde(j,k,a,b),adde(k,j,0,-b);
  60. }
  61. tmp=mfmc();
  62. printf("%d %d",tmp.ll,tmp.rr);
  63. return 0;
  64. }

这就不写伪代码了吧!?

以后补

让菜鸡讲一讲费用流(EK)的更多相关文章

  1. HDU 2064 菜鸡第一次写博客

    果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...

  2. 配置魔药 [NOIP模拟] [DP] [费用流]

    问题描述在<Harry Potter and the Chamber of Secrets>中,Ron 的魔杖因为坐他老爸的 Flying Car 撞到了打人柳,不幸被打断了,从此之后,他 ...

  3. 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记

    一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...

  4. BZOJ5120 [2017国家集训队测试]无限之环 费用流

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5120 题意概括 原题挺简略的. 题解 本题好难. 听了任轩笛大佬<国家队神犇>的讲课才 ...

  5. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

  6. 【BZOJ4849】[Neerc2016]Mole Tunnels 模拟费用流

    [BZOJ4849][Neerc2016]Mole Tunnels Description 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间 ...

  7. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(下)

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/12/es-code03/ 前提 上篇文章写完了 ES 流程启动的一部分,main 方法都入 ...

  8. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/11/es-code02/ 前提 上篇文章写了 ElasticSearch 源码解析 -- ...

  9. [tyvj-2054][Nescafé29]四叶草魔杖 费用流

    lyd讲的最小生成树的题. 道理我都懂,费用流多好写,又好调.但和一般费用流不一样的就是它走过一次后费用需调成0,但是再等回流,就恢复原状即可. #include <queue> #inc ...

随机推荐

  1. http相关文章目录

    四种常见的 POST 提交数据方式  https://imququ.com/post/four-ways-to-post-data-in-http.html

  2. C#多线程Thread

    在项目中经常用到线程Thread,先做个简单记录,后面再完善下,方便以后参考.本人技术有限,如有不同见解之处,欢迎博友批评指正. 执行的线程Thread分无参数的,一个参数,多个参数的.直接看代码吧. ...

  3. MVC框架的实现

    现在web开发基本都是MVC的架构了,struts.springMvc 等等.其中一个重要的功能就是将客户发起的请求,分发至我们定义的Action里面的方法之中. 闲暇之余,我也做了一个类似于spri ...

  4. day001-日期格式类、装拆箱

    1.Object 1.1 String类型可以不用重写toString()方法 1.2 自定义类一般都去重写toString()方法 调用时机: a)对象名调用toString() b)打印输出时,间 ...

  5. 在sql中如何把一列的值拆分成多列

  6. 前端必须要掌握的几个CSS3的属性

    随着Css3和html5的风靡,越来越多的前端人员开始学习Css3,今天的文章就是来说说前端应该掌握10个Css3属性. 1. Border-radius Border-radius是一大堆CSS3属 ...

  7. tomcat7 的The Apache Tomcat Native library which allows optimal performance 的解决

    1.        用Myeclipse启动tomcat7启动时可能会收到下面的信息: 七月 24, 2014 10:13:30 上午 org.apache.catalina.core.AprLife ...

  8. IOS 设置颜色的的详情

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  9. 使用shc加密bash脚本程序

    摘要以前写看到别人写的脚本用shc加密的,我也有就了解了下. SHC代表shell script compiler,即shell脚本编译器.通过SHC编译过的脚本程序对普通用户而言是不读的,因此如果你 ...

  10. python学习接口测试(二)

    .python接口之http请求 python的强大之处在于提供了很多的标准库以及第三库,本文介绍urllib 和第三库的requests. Urllib 定义了很多函数和类,这些函数和类能够帮助我们 ...