终于把最小费用最大流学会了啊……

各种奇奇怪怪的解释我已经看多了,但在某些大佬的指点下,我终于会了。

原来是个好水的东西。

最小费用最大流是什么?

不可能不知道网络流吧?如果不知道,自行百度去……

费用流就是在每条边添加个费用,设你这条边的流量是f" role="presentation">ff,费用为w" role="presentation">ww,则总费用为fw" role="presentation">fwfw。

举个例子,就像是有许多点的一张图,有很多个管子相连,每个管子都有个容量,并且每流一流量就要花一些费用,问总费用最少是多少。


最小费用最大流怎么做?

首先要知道EK算法……

开玩笑的,其实根本不用,我还没打过普通的EK呢,就只是打过dinic和sap。

这个做法其实很简单:

1、用spfa从原点跑最短路,边权为费用(满流的边不用跑)。

2、将最短路径抽出,在上面找一个残余容量最小的。

3、这一路上的残余容量减少,反向弧的容量增加(反向弧的费用为负的正向的费用)。

4、回到第一步,继续做下去,直到从原点跑不到汇点。

这样就可以算出来了,这就是最普通的EK+spfa做法。

当然还有更好的,但我还不会……

时间复杂度我不知道,毕竟,网络流的时间总是很玄学啊……


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
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 q[1000001];
bool inq[5001];
bool SPFA();
int dis[5001];
EDGE *pre[5001];
void flow(int&,int&);
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;
}
int maxflow,mincost;
flow(maxflow,mincost);
printf("%d %d\n",maxflow,mincost);
return 0;
}
bool SPFA()
{
int h=-1,t=0;
memset(dis,127,sizeof dis);
dis[S]=0;
pre[S]=NULL;
q[0]=S;
inq[S]=1;
do
{
++h;
for (EDGE *ei=last[q[h]];ei;ei=ei->las)
if (ei->c && dis[q[h]]+ei->w<dis[ei->to])
{
dis[ei->to]=dis[q[h]]+ei->w;
pre[ei->to]=ei;
if (!inq[ei->to])
{
inq[ei->to]=1;
q[++t]=ei->to;
}
}
inq[q[h]]=0;
}
while (h!=t);
return dis[T]!=0x7f7f7f7f;
}
void flow(int &maxflow,int &mincost)
{
maxflow=0;
mincost=0;
while (SPFA())
{
int minc=0x7f7f7f7f;
for (EDGE *ei=pre[T];ei;ei=pre[rev(ei)->to])
minc=min(minc,ei->c);
maxflow+=minc;
mincost+=dis[T]*minc;
for (EDGE *ei=pre[T];ei;ei=pre[rev(ei)->to])
{
ei->c-=minc;
rev(ei)->c+=minc;
}
}
}

这个代码我没有对过任何的标程,相信各位可以凭借自己的理解打出来,解析就不打了。

最小费用最大流——EK+SPFA的更多相关文章

  1. NSOJ A fairy tale of the two(最小费用最大流、SPFA版本、ZKW版本)

    n,m<=20,给两个n×m布尔矩阵,每次操作可将第一个矩阵的2个相邻元素互换.输出最少操作次数使得两个矩阵完全一样. 比赛的时候想过按照二分图完美匹配的类似做法构图,不过想到边太多以及卡各种题 ...

  2. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

  3. Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)

    Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...

  4. 图论算法-最小费用最大流模板【EK;Dinic】

    图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...

  5. 【Luogu】P3381最小费用最大流模板(SPFA找增广路)

    题目链接 哈  学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...

  6. 费用流+SPFA ||Luogu P3381【模板】最小费用最大流

    题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...

  7. 费用流+SPFA ||【模板】最小费用最大流

    题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...

  8. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  9. nyoj 712 探 寻 宝 藏--最小费用最大流

    问题 D: 探 寻 宝 藏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有 ...

随机推荐

  1. day22 yield的表达式的应用,面向过程编程,内置函数前几个

    Python之路,Day10 = Python基础10 生成器表达式: (i for i in range(10) if i > 5)os.walk(r'文件路径')返回一个迭代器, 第一次ne ...

  2. FTP Active & Passive

          在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的F ...

  3. springmvc 拦截器不拦截jsp,只拦截控制器的访问

    spring是鼓励把jsp放到WEB-INF文件夹中,然后通过控制器进行访问

  4. UNIT对话系统(杂记)

    单轮对话指标: 召回率=机器人能回答的问题数/问题总数 准确率=机器人正确回答的问题数/问题总数 问题解决率=机器成功解决的问题数/问题总数 多轮对话指标: 任务完成率=成功结束的多轮会话数/多轮会话 ...

  5. 如何为ABAP程序添加权限检查

    一.确认权限对象,及其关联字段: TCode: SU21 例如权限对象"M_MSEG_WMB",它关联字段为"WERKS",详见下图: 二.在ABAP代码中添加 ...

  6. UMP系统功能 读写分离

  7. JS规则 表达出你的想法(表达式) 通常包括常数和变量 var num2 = num1+6;

    表达出你的想法(表达式) 表达式与数学中的定义相似,表达式是指具有一定的值.用操作符把常数和变量连接起来的代数式.一个表达式可以包含常数或变量. 我们先看看下面的JavaScript语句: 生活中&q ...

  8. 微信小程序前后台调用

    // pages/ruquestexer/index.js Page({ /** * 页面的初始数据 */ data: { }, getUserData:function(){ wx.request( ...

  9. vc 获取窗口标题GetWindowText

    今天在写一个模块,具体功能是想时刻监控用户当前活动窗口,需要获取窗口标题以及其它相关信息,记得API GetWindowText就是用来做这个的,结果试了半天,有的获取成功了有的获取失败了,而且有关汉 ...

  10. 安装tomcat8.5

    1.去官网下载安装文件 网址:https://tomcat.apache.org/download-80.cgi 2.在安装目录的bin中运行startup.bat即可启动 3.启动好tomcat后, ...