对于最小费用最大流,我们的通常做法是EK+SPFA。

然而,卡常界大佬ZKW发明了一个求解最小费用最大流的方法,很强啊。

在学ZKW费用流前,先说说KM算法。

KM算法

为啥要先提这个呢?因为ZKW费用流用了一个和它非常类似的做法。

KM算法求的是二分图最大权完美匹配。

在此,我来口胡一下(这个算法其实我并未打过,只懂思想)。

和匈牙利算法差不多,区别在于标号。

对于左右两边的点各自有个标号D" role="presentation">DD,一开始,左边的标号设为最大的连出去的边的权值,右边的设为0。

每次只走,满足Di+Dj=v" role="presentation">Di+Dj=vDi+Dj=v的边。

当发生冲突时,就将右边的点的标号全部加一,左边的点的标号全部减一,然后继续搞。

这就是KM算法的大概思路。

ZKW费用流

到正题了。

类似于KM算法,ZKW算法也有个标号。

当Dx=Dy+w" role="presentation">Dx=Dy+wDx=Dy+w时,才会走这条边。

ZKW算法中,是类似于Dinic的多路增广,在每次增广后,就修改距离标号。

求出距离标号的最小增加值,然后修改距离标号。

当找不出增广路时,算法结束。

代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
int n,m,S,T;
struct EDGE
{
int to,c,w;
EDGE *las;
} e[100001];
int ne;
EDGE *last[5001];
#define rev(ei) (e+(int((ei)-e)^1))
int maxflow,mincost;
bool vis[5001];
int dis[5001];
int dfs(int,int);
bool change();
void flow();
int main()
{
scanf("%d%d%d%d",&n,&m,&S,&T);
for (int i=1;i<=m;++i)
{
int u,v,c,w;
scanf("%d%d%d%d",&u,&v,&c,&w);
e[ne]={v,c,w,last[u]};
last[u]=e+ne;
++ne;
e[ne]={u,0,-w,last[v]};
last[v]=e+ne;
++ne;
}
flow();
printf("%d %d\n",maxflow,mincost);
return 0;
}
int dfs(int x,int s)
{
if (x==T)
{
maxflow+=s;
mincost+=dis[S]*s;
return s;
}
vis[x]=1;
int have=0;
for (EDGE *ei=last[x];ei;ei=ei->las)
if (!vis[ei->to] && ei->c && dis[ei->to]+ei->w==dis[x])
{
int t=dfs(ei->to,min(s-have,ei->c));
ei->c-=t;
rev(ei)->c+=t;
have+=t;
}
return have;
}
bool change()
{
int d=INT_MAX;
for (int i=1;i<=n;++i)
if (vis[i])
for (EDGE *ei=last[i];ei;ei=ei->las)
if (!vis[ei->to] && ei->c)
d=min(d,dis[ei->to]-dis[i]+ei->w);//找出最小增加值
if (d==INT_MAX)
return 0;
for (int i=1;i<=n;++i)
if (vis[i])
dis[i]+=d;//更改距离标号
return 1;
}
void flow()
{
maxflow=0;
mincost=0;
do
do
memset(vis,0,sizeof vis);
while (dfs(S,INT_MAX));
while (change());
}

最小费用最大流——ZKW的更多相关文章

  1. 洛谷.3381.[模板]最小费用最大流(zkw)

    题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...

  2. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status ...

  3. BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模

    本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...

  4. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  5. 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...

  6. bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1576  Solved: 954[Submit][Statu ...

  7. Luogu P3381 (模板题) 最小费用最大流

    <题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...

  8. POJ - 2516 Minimum Cost(最小费用最大流)

    1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...

  9. LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图

    瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...

随机推荐

  1. Linux命令速查手册(第2版)学习

    第1章.需要了解的命令行相关事项 表1-1 如何在文件名字符中使用特殊字符 字符 建议 / 绝不使用.不能转义 \ 必须转义.避免使用 _ 绝不能作为文件或目录名的第一个字符 [] 必须转义.避免使用 ...

  2. 软件设计师_朴素模式匹配算法和KMP算法

    1.从主字符串中匹配模式字符串(暴力匹配) 2. KMP算法

  3. RPC远程过程调用实例详解

    1.创建IDL文件,定义接口. IDL文件可以由uuidgen.exe创建. 首先找到系统中uuidgen.exe的位置,如:C:\Program Files\Microsoft Visual Stu ...

  4. 杂项-语言-Swift:Swift

    ylbtech-杂项-语言-Swift:Swift Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于 ...

  5. Vue的指令和成员

    目录 Vue的指令和成员 指令 表单 斗篷 条件 循环 成员 计算成员 监听成员 Vue的指令和成员 指令 表单 表单指令一般是和属性指令联合使用的,最常见的就是v-model="变量&qu ...

  6. Spring 声明式事务管理(11)

    案例分析 本案例是图书管理系统精简部分,在数据库中有3张表.分别保存图书库存.图书信息和用户信息.下面是建表SQL语句 1 DROP TABLE IF EXISTS store; 2 DROP TAB ...

  7. Spring 基于Aspectj切面表达式(6)

    1 package com.proc; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.ProceedingJoinP ...

  8. 一个很笨的方法,写脚本来实现自动调dmp,找有用的数据

    很久很久以前用到的方法, 方法挺笨的,但是算是比较实用吧. 全自动的调试dmp,最后只要结果. 谁用得着就给谁看吧. 这里需要两个脚本 1:启动脚本,是一个批处理文件,用来启动调试器,来加载dmp和调 ...

  9. Python全栈开发:DOM

    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...

  10. 跳过爱奇艺优酷vip

      1.google chrome浏览器  2.下载插件安装 Tampermonkey  https://pan.baidu.com/s/1qvRQD2UO6gPHogjtSUBwUw       将 ...