ZKW,SPFA费用流模板
来源:互联网 发布:mac万得股票机构 编辑:程序博客网 时间:2024/05/16 15:37
费用流比较常用的做法有两种:SPFA费用流和ZKW费用流
两种费用流的基本做法相同:找到费用最小的路,不断增广到不能增广为止
正确性很显然,因为每次都找费用最小的路,所以费用一定最小,因为增广到不能增广才停止,所以一定是最大流
SPFA
费用流打起来和理解起来很简单,就是通过SPFA找到费用最小的路,并把这条路上的每条边的流量都减去这整条路的流量最小值,不断循环直到找不到增广路位置
缺点也很显然:在稠密图中速度太慢
Code:
找不到C++的了,发一个几年前码的Pascal吧
function spfa:boolean;var i,j,k,l:longint;begin for i:=1 to t do begin f[i]:=-maxlongint+100000;bz[i]:=false;end; i:=0;j:=1; d[1]:=s;bz[s]:=true; f[s]:=0; while i<j do begin inc(i); l:=d[i]; for k:=1 to t do begin if (a[l,k]>0)and(f[l]+c[l,k]>f[k]) then begin f[k]:=c[l,k]+f[l]; from[k]:=l; if bz[k]=false then begin bz[k]:=true; inc(j);d[j]:=k; end; end; end; bz[l]:=false; end; exit(f[t]>0);end;begin while spfa do begin i:=t; mi:=maxlongint; while i<>s do begin j:=i;i:=from[i]; mi:=min(mi,a[i,j]); end; i:=t; while i<>s do begin j:=i;i:=from[i]; dec(a[i,j],mi);inc(a[j,i],mi); ans:=ans+c[i,j]; end; end; writeln(ans);end.
ZKW
这种做法略高级,理解起来有一点难度
它和SAP的做法有点像,SAP是只走高度相差为1的点,ZKW只走费用差最小的点
也就是说,ZKW中的费用相当于SAP中的高度
设dis[x]表示x到T的最短费用
假设有一条路从x->y
那么dis[x]-fee[x,y]=dis[y]
也就是每次在已经走的点中选一个高度(dis)升高最小的作为下次增广的边
我语文能力太差,直接上标吧
putin是连边
#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>using namespace std;int n,m,S,T,last[M],next[M*10],to[M*10],date[M*10],tot=1,bz[M],a[N][N];db fee[M*10],dis[M];void putin(int x,int y,int z,db f){ next[++tot]=last[x];last[x]=tot;to[tot]=y;fee[tot]=f,date[tot]=z; next[++tot]=last[y];last[y]=tot;to[tot]=x;fee[tot]=-f;date[tot]=0;}int dg(int x,int z){ if(x==T) return z; int jy=0;bz[x]=1; for(int i=last[x];i;i=next[i]) { int y=to[i]; if(!bz[y]&&date[i]&&abs(dis[y]-dis[x]+fee[i])<0.000001) { int qq=dg(y,min(date[i],z)); jy+=qq,date[i]-=qq,date[i^1]+=qq,z-=qq; if(z==0) return jy; } } return jy;}bool change(){ db minh=INF; fo(x,1,T) if(bz[x]) for(int i=last[x];i;i=next[i]) { int y=to[i]; if(!bz[y]&&date[i]>0) minh=min(minh,dis[y]-dis[x]+fee[i]); } if(abs(minh-INF)<0.000001) return 0; if(minh<-1) return 0; fo(x,1,T) if(bz[x]) dis[x]+=minh; return 1;}int main(){ do do memset(bz,0,sizeof(bz)); while(dg(S,INF)); while(change());}
阅读全文
2 0
- ZKW,SPFA费用流模板
- 网络流 费用流 模板 ISAP+SPFA+ZKW
- ZKW费用流 模板
- zkw费用流模板
- zkw费用流模板
- ZKW费用流 模板
- BZOJ1070 修车(zkw费用流 or spfa费用流)
- SPFA费用流模板
- [ACM模板]ZKW MCMF费用流
- 费用流模板 spfa+EK
- 【费用流算法:ZKW】
- ZKW费用流
- poj3680 zkw费用流
- zkw费用流
- zkw最小费用流
- zkw费用流
- zkw费用流模板(适用二分图)
- bzoj 1070: [SCOI2007]修车 zkw费用流模板
- 【MyBatis学习15】MyBatis的逆向工程生成代码
- SAPUI5教程——The project is corrupted because its '.user.project.json' file has an invalid JSON
- 数据库拆分的问题
- 湘潭CCPC A题
- linux备忘
- ZKW,SPFA费用流模板
- 敏捷常见错误观念及敏捷团队常犯的错误(笔记)
- <c:forEach>的简单使用
- 几个常用的Activity属性
- 面向对象系统开发过程
- Linux串口驱动程序(2)-串口驱动程序初始化分析
- sql,js
- 使用神经网络对黄金期货交割价格进行预测-3 MATLAB
- Lucene的使用