让菜鸡讲一讲费用流(EK)
让我再讲一个故事吧。
又有一些小精灵要准备从银月城(S)迁徙到Nibel山(T)。
这两个地方之间的道路构成了一个网络。
每个道路都有它自己的容量,这决定了每天有多少小精灵可以同时从这儿通过。
和上一篇不同的是,由于上次迁徙的规模很大,
吸引了其它一些种族的注意,
这次每条道路都会有一些人/兽人/哥布林/...向精灵们征收过路费,
现在精灵们想知道,在花费最小的情况下,它们迁徙的速度最大是多少只每天。
费用流=最小费用最大流
在要求流最大的情况下要求费用最小,好像原来的isap已经派不上用场了呢!
让我们回到最朴实的EK算法上。
EK算法每一次只寻找一条增广路,
这带给它解决这一个方面的问题的得天独厚的优势。
这是原来的EK伪算法:
int BFS()
{
/*找到一条增广路*/
}
int ek()
{
/*对找到的增广路进行一系列处理*/
}
我们用BFS找增广路。
想象一下,
既然要求费用最小,
我们就把费用作为路径长度,
之后每一次跑一遍最短路,
那么就可以保证花费最小了!
所以,我们只要把原来的BFS()
改成spfa()
或者dijkstra()
就好啦
ps.一般dijkstra只能跑不带负权边的图,
但是有一种特殊的技巧可以把边权魔改成正的。
以下是拿辣鸡spfa跑的费用流
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
#define mp(a,b) make_pair(a,b)
#define ll first
#define rr second
inline int gotcha()
{
register int a=0,b=1,c=getchar();
while(!isdigit(c))b^=a=='-',c=getchar();
while(isdigit(c))a=a*10+c-48,c=getchar();
return b?a:-a;
}
const int _ = 5002 , __ = 50002<<1 , inf = 0x3f3f3f3f;
int to[__],ne[__],v[__],co[__],he[__]={0},ecnt=1;
int n,m,dis[_],pe[_],pv[_],S,T;
bool ed[_];
void adde(int a,int b,int c,int d){to[++ecnt]=b,v[ecnt]=c,co[ecnt]=d,ne[ecnt]=he[a],he[a]=ecnt;}
queue<int> q;
int spfa()
{
memset(dis,63,sizeof(dis)),memset(ed,0,sizeof(ed));
while(!q.empty())q.pop();
register int i,a;
q.push(S),ed[S]=1,dis[S]=0;
while(!q.empty())
{
a=q.front(),q.pop();ed[a]=0;
for(i=he[a];i;i=ne[i])
if(v[i]>0 && dis[to[i]]>dis[a]+co[i])
{
dis[to[i]]=dis[a]+co[i];
pe[to[i]]=i,pv[to[i]]=a;
if(!ed[to[i]])ed[to[i]]=1,q.push(to[i]);
}
}
return dis[T]<inf;
}
pii mfmc()
{
register int i,sco=0,sfl=0,flw;
while(spfa())
{
flw=inf;
for(i=T;i!=S;i=pv[i])flw=min(flw,v[pe[i]]);
for(i=T;i!=S;i=pv[i])v[pe[i]]-=flw,v[pe[i]^1]+=flw;
sco+=flw*dis[T],sfl+=flw;
}
return mp(sfl,sco);
}
int main()
{
register int i,j,k,a,b;
register pii tmp;
n=gotcha(),m=gotcha(),S=gotcha(),T=gotcha();
for(i=1;i<=m;i++)
{
j=gotcha(),k=gotcha(),a=gotcha(),b=gotcha();
adde(j,k,a,b),adde(k,j,0,-b);
}
tmp=mfmc();
printf("%d %d",tmp.ll,tmp.rr);
return 0;
}
这就不写伪代码了吧!?
以后补
让菜鸡讲一讲费用流(EK)的更多相关文章
- HDU 2064 菜鸡第一次写博客
果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...
- 配置魔药 [NOIP模拟] [DP] [费用流]
问题描述在<Harry Potter and the Chamber of Secrets>中,Ron 的魔杖因为坐他老爸的 Flying Car 撞到了打人柳,不幸被打断了,从此之后,他 ...
- 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...
- BZOJ5120 [2017国家集训队测试]无限之环 费用流
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5120 题意概括 原题挺简略的. 题解 本题好难. 听了任轩笛大佬<国家队神犇>的讲课才 ...
- 初识费用流 模板(spfa+slf优化) 餐巾计划问题
今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...
- 【BZOJ4849】[Neerc2016]Mole Tunnels 模拟费用流
[BZOJ4849][Neerc2016]Mole Tunnels Description 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间 ...
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(下)
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/12/es-code03/ 前提 上篇文章写完了 ES 流程启动的一部分,main 方法都入 ...
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/11/es-code02/ 前提 上篇文章写了 ElasticSearch 源码解析 -- ...
- [tyvj-2054][Nescafé29]四叶草魔杖 费用流
lyd讲的最小生成树的题. 道理我都懂,费用流多好写,又好调.但和一般费用流不一样的就是它走过一次后费用需调成0,但是再等回流,就恢复原状即可. #include <queue> #inc ...
随机推荐
- springboot 修改和设置 banner
springboot 修改和设置 banner 先上图 修改步骤 1.在src/main/resources下新建一个banner.txt文档 2.通过http://patorjk.com/softw ...
- 如何在VMware ubuntu linux虚拟机中安装VMware tools
VMware Tools可以实现在主机<->虚拟机之间拷贝文字.文件等功能.本文讲述如何在VMware ubuntu linux虚拟机中安装VMware tools. 测试环境: VMwa ...
- 支持多域名的免费SSL证书
知乎网友称其支持多域名: https://www.zhihu.com/question/19578422 配置教程: https://www.cnblogs.com/duanweishi/p/8483 ...
- VR社交软件测试-AltspaceVR
该VR社交软件中的主界面主要分为,Events:事件:Activities:多人游戏:Words:别人创建的虚拟世界.进入游戏后可以进入场景与世界各地的人进行交谈,以虚拟3D人物的方式显示用户,具有较 ...
- C# 驱动的mongodb的分页查询简单示例
/// <summary> /// mongodb分页查询 /// </summary> /// <typeparam name="T">< ...
- UML总结:UML用于建模描述结构和行为
UML有3种基本的构造块:组件.关系和图 我们将 UML 中的图分为两大类: 结构图 行为图 (1)结构建模: 结构建模具有捕捉静态的功能,包括下列各项: 类图 对象图 组件图 部署图 结构模型代表的 ...
- 【LOJ6513】「雅礼集训 2018 Day10」足球大战(数学题)
点此看题面 大致题意: 已知主队每秒进球概率为\(p\),客队每秒进球概率为\(q\),求主队进球数大于客队的概率. 推式子 考虑枚举主队进球数\(i\),则客队进球数必然小于\(i\),因此可再枚举 ...
- openstack kilo 命令行
把下面内容放到.bashrc中,或者直接执行也行. export OS_USERNAME=adminexport OS_PASSWORD=admin #根据实际密码来设 ...
- mysql 全连接 报错1051的原因
由于mysql 不支持 直接写full outer join 或者 full join来表示全外连接但是可以用left right union right 代替 下面是例子: select * fro ...
- 路由传参,path和query的刷新报错js文件丢失
日常的路由跳转,基本都会用到传参,有两种方式:path + query, name + params 常用的写法: this.$router.push({ path: 'proDetail',quer ...