最小费用最大流总结
来源:互联网 发布:报纸排版软件 adobe 编辑:程序博客网 时间:2024/05/17 08:22
最小费用最大流
在费用流的图上,边不仅有流量还有权值。
最小费用最大流就是在最大流不唯一时,求权值最小的方案,其基本思想就是在最大流的基础上考虑费用最小。解决这种问题的操作可以描述为多次迭代的过程,下面来介绍解决这种问题的一种方法——Spfa增广。
Spfa增广
基本思想是:从零流为初始可行流开始,在每次迭代过程中对每条边赋予与cap(容量)、w(单位流量运输费用)、flow(现有流的流量)有关的权数dis(i,j),形成一个有向赋权图。再用Spfa确定由s到t的费用最小的非饱和路,沿着该路增加流量,得到相应的新流。经过多次迭代,直至达到最大流为止。
因为没有找到很好的裸题,所以选了Hdu 2135,一道类最短路问题。
因为从起点出发走到终点还要再回起点,所以要把起点终点拆掉,建一条容量为2的边。
#include<cstdio>#include<cstring>#include<algorithm>const int maxn=1005,maxm=40005;int lnk[maxn],son[maxm],fa[maxm],nxt[maxm],cap[maxm],flow[maxm],f[maxm];int n,m,tot,w[maxm],que[maxn],hed,til,dis[maxn],p[maxn],ans,INF;bool vis[maxn];void add(int x,int y,int c,int z){ nxt[tot]=lnk[x];lnk[x]=tot;fa[tot]=x;son[tot]=y;w[tot]=z;cap[tot]=c;tot++; nxt[tot]=lnk[y];lnk[y]=tot;fa[tot]=y;son[tot]=x;w[tot]=-z;cap[tot]=0;tot++;}int mi(int x,int y){if (x<y) return x;return y;}bool spfa(){ memset(vis,0,sizeof(vis)); memset(dis,63,sizeof(dis)); memset(p,63,sizeof(p)); hed=0;til=1;que[1]=0;INF=dis[0];vis[0]=1;dis[0]=0; while (hed!=til){ int x=que[hed=(hed+1)%maxn];vis[x]=0; for (int j=lnk[x];j!=-1;j=nxt[j]) if (cap[j]>flow[j]&&dis[x]+w[j]<dis[son[j]]){ dis[son[j]]=dis[x]+w[j];f[son[j]]=j; p[son[j]]=mi(p[x],cap[j]-flow[j]); if (!vis[son[j]]){ que[til=(til+1)%maxn]=son[j]; vis[son[j]]=1; } } } if (dis[n+1]==INF) return 0; ans+=dis[n+1]*p[n+1]; for (int i=n+1;i;i=fa[f[i]]) flow[f[i]]+=p[n+1],flow[f[i]^1]-=p[n+1]; return 1;}int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); memset(lnk,255,sizeof(lnk)); scanf("%d%d",&n,&m); add(0,1,2,0);add(n,n+1,2,0); while (m--){ int x,y,z;scanf("%d%d%d",&x,&y,&z); add(x,y,1,z);add(y,x,1,z); } while (spfa()); printf("%d\n",ans); return 0;}
阅读全文
0 0
- 最小费用最大流总结
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 【最小费用最大流】
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- LeetCode 64. Minimum Path Sum 解题报告
- 移动端长按事件
- 最简单的安卓接入微信支付教程,不简单你打我!
- 计算机网络原理知识点(第五章:运输层)
- HDU
- 最小费用最大流总结
- Gensim入门教程
- 基于装饰者模式的变种
- Codeforces 813 C The Tag Game
- %运算符总结
- Java实现-岛屿的个数
- Android相对布局
- 前端面试题-基础理论汇总
- 简单计算几何+卡精度 New Year Table CodeForces