博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】最小费用最大流
阅读量:6836 次
发布时间:2019-06-26

本文共 1841 字,大约阅读时间需要 6 分钟。

给出一个容量网络,那他的最大流一定是一个定值(即使是有多个一样的最大值)。

所以我们从开始的可行流开始增广时,最终的增广量是一定的。
所以为了满足最小费用我们只需要每次找最小费用的增广路即可,直到流量为最大值。
这个问题仅仅是在求增广路时先考虑费用最小的增广路,其他思想和EK思想一样。
我们学过SPFA求最短路算法(bellman-ford的队列优化),所以我们将弧的费用看做是路径长度,即可转化为求最短路的问题了。只需要所走的最短路满足两个条件即可:1剩余流量不为0,2路径变短d[v]>d[u]+cost< u,v> 。

这里写图片描述

#include
#include
#include
#include
#include
#include
#include
using namespace std;int n,m,S,T;int num[100005],cap[100005],cost[100005],nxt[100005],head[5005],cnt=1;//cap记残余流量,cost记费用int dis[5005],flow[5005],xb[5005];//xb记链表数组的下标,dis用于spfaint pre[5005];bool used[5005];int mflow=0,mcost=0;void add(int from,int to,int ca,int co){ cnt++;//从 2 开始 ,若从0开始,会导致找点时循环停止!!! num[cnt]=to; nxt[cnt]=head[from]; head[from]=cnt; cost[cnt]=co; cap[cnt]=ca;}int bfs(int s,int t){ memset(dis,127,sizeof(dis)); memset(used,false,sizeof(used)); for(int i=1;i<=n;i++) pre[i]=-1; queue
q; while(!q.empty()) q.pop(); q.push(s); pre[s]=0; dis[s]=0; used[s]=true; flow[s]=dis[0]; while(!q.empty()) { int k=q.front(); q.pop(); used[k]=false; for(int i=head[k];i;i=nxt[i]) { int to=num[i]; if(cap[i]>0&&dis[to]>dis[k]+cost[i])//在spfa判断条件基础上,加上剩余流量>0 { xb[to]=i; dis[to]=dis[k]+cost[i]; flow[to]=min(flow[k],cap[i]); if(!used[to]) used[to]=true,q.push(to); pre[to]=k; } } } if(pre[t]==-1) return -1; else return flow[t]; }void maxflow(int s,int t){ int d; while(bfs(s,t)!=-1) { d=flow[t]; int k=t; while(k!=s) { cap[xb[k]]-=d; cap[xb[k]^1]+=d; k=pre[k]; } mflow+=d; mcost+=d*dis[t];//每条边上的流量为d,dis[t]为每条边单位流量费用之和 if(d==0) break; } return;}int main(){ scanf("%d%d%d%d",&n,&m,&S,&T); for(int i=1;i<=m;i++) { int u,v,w,f; scanf("%d%d%d%d",&u,&v,&w,&f); add(u,v,w,f); add(v,u,0,-f); } maxflow(S,T); printf("%d %d",mflow,mcost); return 0;}

转载于:https://www.cnblogs.com/dfsac/p/6819724.html

你可能感兴趣的文章
读一读以前的C# clr 笔记
查看>>
深度解析 ASP.NET MVC 5 (内部培训讲义)
查看>>
Three.js光线(二)
查看>>
方法名称作为参数传入函数中
查看>>
手动注册maven本地仓库
查看>>
Android onClick 按钮单击事件 四种常用写法
查看>>
C++中清空缓冲区
查看>>
html 空白汉字占位符&#12288;
查看>>
Linux学习之文件特殊权限详解(SetUID、SetGID、Sticky BIT)(十一)
查看>>
VS2010 打开 VS2012 的项目
查看>>
celery定时器以及出错解决方案Celery Received unregistered task of type
查看>>
canvas toDataURL() 方法如何生成部分画布内容的图片
查看>>
Android 多用户模式原理和实现介绍
查看>>
android:largeHeap介绍
查看>>
Android四大组件之Service浅见
查看>>
IIS6不重启改应用程序.net framework 4.0的方法
查看>>
c++编程:获取控件上的文本值---例子是CEdit 的七种方法(转载)
查看>>
常见设计模式
查看>>
【转载】TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成...
查看>>
1016 因子之和
查看>>