1. const int INF=;
  2. const int maxn=,maxm=;
  3. int cnt=,fir[maxn],nxt[maxm],to[maxm];
  4. int cap[maxm],val[maxm],dis[maxn],path[maxn];
  5.  
  6. void add(int a,int b,int c,int v){
  7. nxt[++cnt]=fir[a];to[cnt]=b;
  8. cap[cnt]=c;val[cnt]=v;fir[a]=cnt;
  9. }
  10. void addedge(int a,int b,int c,int v){
  11. add(a,b,c,v);
  12. add(b,a,,-v);
  13. }
  14.  
  15. int S,T;
  16. int vis[maxn];
  17. int Spfa(){
  18. deque<int>q;
  19. memset(dis,,sizeof(dis));
  20. memset(vis,,sizeof(vis));
  21. q.push_front(S);
  22. dis[S]=;vis[S]=;
  23. while(!q.empty()){
  24. int x=q.front();q.pop_front();vis[x]=;
  25. for(int i=fir[x];i;i=nxt[i])
  26. if(cap[i]&&dis[x]+val[i]<dis[to[i]]){
  27. dis[to[i]]=val[i]+dis[x];
  28. path[to[i]]=i;
  29. if(vis[to[i]])continue;
  30. if(dis[to[i]]<dis[x])
  31. q.push_front(to[i]);
  32. else
  33. q.push_back(to[i]);
  34. vis[to[i]]=;
  35. }
  36. }
  37. return dis[T]==dis[T+]?:dis[T];
  38. }
  39.  
  40. int Aug(){
  41. int p=T,f=INF;
  42. while(p!=S){
  43. f=min(f,cap[path[p]]);
  44. p=to[path[p]^];
  45. }
  46. p=T;
  47. while(p!=S){
  48. cap[path[p]]-=f;
  49. cap[path[p]^]+=f;
  50. p=to[path[p]^];
  51. }
  52. return f;
  53. }
  54.  
  55. int MCMF(){
  56. int ret=,d;
  57. while(d=Spfa())
  58. ret+=Aug()*d;
  59. return ret;
  60. }
  1. #include <queue>
  2. using namespace std;
  3. const int maxn=;
  4. const int maxm=;
  5. const int INF=;
  6. int n,m,w[maxn],cnt,fir[maxn],to[maxm],nxt[maxm];
  7. int cap[maxm],val[maxm],path[maxn],vis[maxn],dis[maxn];
  8. queue<int>q;
  9. struct Net_Flow{
  10. Net_Flow(){cnt=;}
  11.  
  12. void add(int a,int b,int c,int v){
  13. nxt[++cnt]=fir[a];cap[cnt]=c;
  14. to[cnt]=b;val[cnt]=v;fir[a]=cnt;
  15. }
  16.  
  17. void addedge(int a,int b,int c,int v){
  18. add(a,b,c,v);add(b,a,,-v);
  19. }
  20.  
  21. int Spfa(int S,int T){
  22. memset(dis,,sizeof(dis));
  23. q.push(S);vis[S]=;dis[S]=;
  24. while(!q.empty()){
  25. int x=q.front();q.pop();vis[x]=;
  26. for(int i=fir[x];i;i=nxt[i])
  27. if(cap[i]&&dis[to[i]]>dis[x]+val[i]){
  28. dis[to[i]]=dis[x]+val[i];
  29. if(!vis[to[i]])q.push(to[i]);
  30. vis[to[i]]=;path[to[i]]=i;
  31. }
  32. }
  33. return dis[T];
  34. }
  35.  
  36. int Aug(int S,int T){
  37. int p=T,f=INF;
  38. while(p!=S){
  39. f=min(f,cap[path[p]]);
  40. p=to[path[p]^];
  41. }p=T;
  42. while(p!=S){
  43. cap[path[p]]-=f;
  44. cap[path[p]^]+=f;
  45. p=to[path[p]^];
  46. }
  47. return f;
  48. }
  49.  
  50. int MCMF(int S,int T){
  51. int v=,d;
  52. while((d=Spfa(S,T))!=INF)
  53. v+=d*Aug(S,T);
  54. return v;
  55. }
  56. }mcmf;

Spfa费用流模板的更多相关文章

  1. HDU 6611 K Subsequence(Dijkstra优化费用流 模板)题解

    题意: 有\(n\)个数\(a_1\cdots a_n\),现要你给出\(k\)个不相交的非降子序列,使得和最大. 思路: 费用流建图,每个点拆点,费用为\(-a[i]\),然后和源点连边,和后面非降 ...

  2. HDU2686 费用流 模板

    Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

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

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

  4. hdu1533 费用流模板

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. 费用流模板(带权二分图匹配)——hdu1533

    /* 带权二分图匹配 用费用流求,增加源点s 和 汇点t */ #include<bits/stdc++.h> using namespace std; #define maxn 1000 ...

  6. 【费用流】【Next Array】费用流模板(spfa版)

    #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using ...

  7. POJ 2175 spfa费用流消圈

    题意:给出n栋房子位置和每栋房子里面的人数,m个避难所位置和每个避难所可容纳人数.然后给出一个方案,判断该方案是否最优,如果不是求出一个更优的方案. 思路:很容易想到用最小费用流求出最优时间,在与原方 ...

  8. 最长可重区间集 spfa费用流

    给定实直线L上的n个开区间,和一个正整数k 选取若干个区间,在保证实直线L上的任意一个点最多被选出区间覆盖k次的情况下,使得这些区间的长度和最大 先把区间按照左端点排序, 考虑到重复其实就代表着相交, ...

  9. ZOJ 3362 Beer Problem(SPFA费用流应用)

    Beer Problem Time Limit: 2 Seconds      Memory Limit: 32768 KB Everyone knows that World Finals of A ...

随机推荐

  1. HDFS的Java客户端操作代码(查看HDFS下所有的文件存储位置信息)

    1.查看HDFS下所有的文件存储位置信息 package Hdfs; import java.net.URI; import org.apache.hadoop.conf.Configuration; ...

  2. JavaScript正则验证数字、英文、电话号、身份证号、邮箱地址、链接地址等

    验证是否为数字:/^[0-9]*$/验证是否为汉字:/^[\u4e00-\u9fa5],{0,}$/验证x-y位的数字:/^\d{x,y}$/验证由26个英文字母组成的字符串:/^[A-Za-z]+$ ...

  3. List(列表)

    List(列表): List的特征是其元素以线性方式存储,集合中可以存放重复对象. List接口主要实现类包括: ArrayList() : 代表长度可以改变得数组.可以对元素进行随机的访问,向Arr ...

  4. updatepanel局部刷新功能,实现注册时对用户名的检测

    updatepanel的使用 通过将控件放入到updatepanel中,实现局部刷新. 前台代码:<asp:ScriptManager ID="ScriptManager1" ...

  5. c# 连接oracle 读取数据

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. Gprinter Android SDK V1.0 使用说明

    佳博打印机代理商淘宝店https://shop107172033.taobao.com/index.htm?spm=2013.1.w5002-9520741823.2.Sqz8Pf 在此店购买的打印机 ...

  7. spring-quartz普通任务与可传参任务

    两者区别与作用: 普通任务:总调度(SchedulerFactoryBean)--> 定时调度器(CronTriggerFactoryBean) --> 调度明细自定义执行方法bean(M ...

  8. IOS DLNA开发(CyberLink和PlatinumKit)

    1.CyberLink 和 PlatinumKit 两者的比较 CyberLink大概在2010年之后功能就没有更新,部分功能不够完善,网上有下载地址 http://www.pudn.com/down ...

  9. SGU 139.Help Needed!

    题意: 判断15数码问题是否有解. 如果0的偏移量和逆序对个数同奇偶则无解. 因为目标状态的偏移量为0,逆序对为15,而0移动的时候偏移量±1,逆序对的改变量为也为奇数. 这就使得偏移量和逆序对数始终 ...

  10. 24种设计模式--代理模式【Proxy Pattern】

    什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀. ...