利用SPFA+EK算法解决费用流问题

例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题

这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这种题,老实说挺难的

先直接给出建图的代码:

  1. scanf("%d",&x);
  2. //把每个节点拆成两个,分别为ai和bi
  3. //ai向bi连边,费用为权值,容量为1
  4. //再连边,费用为0,容量为k,保证联通
  5. addedge((i-)*n+j,(i-)*n+j+n*n,,x);
  6. addedge((i-)*n+j,(i-)*n+j+n*n,k,);
  7. //让bi能往下面或者左面走
  8. if(j<n)
  9. addedge((i-)*n+j+n*n,(i-)*n+j+,k,);
  10. if(i<n)
  11. addedge((i-)*n+j+n*n,i*n+j,k,);

然后给出完整实现,请记住cnt初始必须是1,为了和^配套使用

否则RE???

差点儿把以后的自己坑死

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn=;
  6. const int maxm=;
  7. const int INF=0x7fffffff;
  8. int n,k,cnt=;
  9. bool inq[maxn];
  10. int g[maxn],dis[maxn],q[maxm],from[maxn];
  11. long long ans;
  12. struct Edge{int from,to,v,c,next;}e[maxm];
  13. void addedge(int u,int v,int w,int c) //cost是费用
  14. {
  15. e[++cnt].from=u;e[cnt].to=v;e[cnt].v=w;e[cnt].c=c;
  16. e[cnt].next=g[u];g[u]=cnt;
  17.  
  18. e[++cnt].from=v;e[cnt].to=u;e[cnt].v=;e[cnt].c=-c;
  19. e[cnt].next=g[v];g[v]=cnt;
  20. }
  21. bool spfa()
  22. {
  23. int t=,w=,u;
  24. memset(dis,-,sizeof(dis));
  25. q[]=;dis[]=;inq[]=;
  26. while(t<w)
  27. {
  28. u=q[t];t++;
  29. for(int tmp=g[u];tmp;tmp=e[tmp].next)
  30. {
  31. if(e[tmp].v>&&dis[u]+e[tmp].c>dis[e[tmp].to])
  32. {
  33. dis[e[tmp].to]=dis[u]+e[tmp].c;
  34. from[e[tmp].to]=tmp;
  35. if(!inq[e[tmp].to])
  36. {q[w]=e[tmp].to;w++;inq[e[tmp].to]=;}
  37. }
  38. }
  39. inq[u]=;
  40. }
  41. if(dis[]==-) return ;
  42. return ;
  43. }
  44. void mincf()
  45. {
  46. int sum=INF;
  47. int tmp=from[];
  48. while(tmp)
  49. {
  50. sum=min(sum,e[tmp].v);
  51. tmp=from[e[tmp].from];
  52. }
  53. tmp=from[];
  54. while(tmp)
  55. {
  56. e[tmp].v-=sum;
  57. e[tmp^].v+=sum;
  58. ans+=sum*e[tmp].c;
  59. tmp=from[e[tmp].from];
  60. }
  61. }
  62. int main()
  63. {
  64. int x;
  65. scanf("%d%d",&n,&k);
  66. for(int i=;i<=n;i++)
  67. for(int j=;j<=n;j++)
  68. {
  69. scanf("%d",&x);
  70. //把每个节点拆成两个,分别为ai和bi
  71. //ai向bi连边,费用为权值,容量为1
  72. //再连边,费用为0,容量为k,保证联通
  73. addedge((i-)*n+j,(i-)*n+j+n*n,,x);
  74. addedge((i-)*n+j,(i-)*n+j+n*n,k,);
  75. //让bi能往下面或者左面走
  76. if(j<n)
  77. addedge((i-)*n+j+n*n,(i-)*n+j+,k,);
  78. if(i<n)
  79. addedge((i-)*n+j+n*n,i*n+j,k,);
  80. }
  81. //源点和汇点
  82. addedge(,,k,);
  83. addedge(n*n*,,k,);
  84. while(spfa()) mincf();
  85. printf("%lld",ans);
  86. return ;
  87. }

还有一点就是这个题是最大费用最大流,最小费用最大流还有ZKW费用流以后再介绍

图论:费用流-SPFA+EK的更多相关文章

  1. BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)

    题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...

  2. BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)

    题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...

  3. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  4. BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)

    BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...

  5. 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流

    [bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...

  6. 费用流+SPFA ||Luogu P3381【模板】最小费用最大流

    题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...

  7. 费用流+SPFA ||【模板】最小费用最大流

    题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...

  8. 洛谷.1251.餐巾计划问题(费用流SPFA)

    题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...

  9. BZOJ.2879.[NOI2012]美食节(费用流SPFA)

    题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...

随机推荐

  1. python中的os,shutil模块的定义以及用法

    # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Uni ...

  2. Jexus支持HTTPS协议

    众所周知,在HTTPS页面请求HTTP资料的时候,现代浏览器会拦截,提示用户是否继续,或者直接拦截,提示都不出来. 最近给自己做了个快速书签工具,点击书签就直接把书签发送到服务器地址,然后保存到我的网 ...

  3. Memcached Hash算法

    本文来自网易云社区 作者:吕宗胜 Hash算法 1. Memcached Hash介绍 我们在前面的文章中已经介绍过了Memcached的内存管理方式,LRU的策略.由于Memcached的数据存储方 ...

  4. Question | 关于Android安全的一二事

    本文来自网易云社区 "Question"为网易云易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑.如果你有什么疑惑,也欢迎通过邮件(zhangyong02@corp.ne ...

  5. php 使用GD库压缩图片,添加文字图片水印

    先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...

  6. JVM 什么时候会触发FGC

    1:System.gc(); 2:老年代满了 没啥好说的从年轻代去往老年代的 3:JDK7或JDK6中永久区满了 得看是否还会有分配,如果没有就不会进行FGC,不过CMS GC下会看到不停地CMS G ...

  7. Laxcus大数据分布计算演示实例

    Laxcus大数据管理系统提供了基于Diffuse/Converge分布算法的计算能力.算法的具体介绍详见<Laxcus:大数据处理系统>一文.本图展示了在集群环境下的随机数产生.排序.显 ...

  8. c#执行插入sql 时,报错:异常信息:超时时间已到。在操作完成之前超时时间已过或服务器未响应

    问题:c#执行插入sql 时,报错:异常信息:超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决: SqlCommand cmd = new SqlCommand(); cmd.Comman ...

  9. 小程序开发时PC端调试返回结果和手机端IOS不一致问题

    IOS11登录时遇到一个请求与PC返回不一致情况, 在小程序调试时IOS上始终没有wx.request() 不能发送请求 尝试解决方法 打开微信小程序调试的设置, 将TLS设为可信任的域名 设置 -- ...

  10. BZOJ 4184 shallot 线性基+分治

    Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...