发了网络流,再来一发费用流

能做费用流的,网络流自然做得来,但在这还是不要脸的安利一下自己的博客(里面也有网络流的题解):

点我

扯远了...

费用流,就是在不炸水管的情况下求源点到汇点的最小费用。

有没有想起什么?

思考一下......

对,最短路径!

所以我们完全可以用已死的SPFA求出不炸水管的最短路径(当然,实在有心理阴影的可以用dijkstra)。

如果你最短路径都不会,还是去 这儿 和 这儿

然后再一把增广路求出最大流与最小费用就好了(我觉得很OK)

献上本蒟蒻的代码:

#include<cstdio>
#define maxn 5050
#define maxm 50005
#define INF 0x3f3f3f3f
inline int read(){
int r=,f=;
char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){r=(r<<)+(r<<)+c-'';c=getchar();}
return r*f;
}
int s,t,n,m,head[maxn],pre[maxn],dis[maxn],q[maxn];
bool vis[maxn];
int s_e;
struct E{
int v,c,w,nxt;
}e[maxm*];
struct Max_fei{//本人喜欢结构体
inline void a_e(int u,int v,int c,int w){
e[s_e]=(E){v,c,w,head[u]};
head[u]=s_e++;
}
inline void add(int u,int v,int c,int w){
a_e(u,v,c,w);
a_e(v,u,,-w);
}
inline bool spfa(){
for(int i=;i<=n;i++){
dis[i]=INF;
vis[i]=false;
}
dis[s]=;
vis[s]=true;
q[]=s;
int hd=,tl=;
while(hd^tl){
int u=q[hd++];//循环队列
hd%=maxn;
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w&&e[i].c){//判断水管还能运水吗
dis[v]=dis[u]+e[i].w;//更新
pre[v]=i;//记录位置
if(vis[v])continue;//如果在队里,那就不进队
vis[v]=true;
q[tl++]=v;
tl%=maxn;
}
}
vis[u]=false;
}
if(dis[t]==INF)return false;
return true;
}
inline int min(int a,int b){//原谅我的手写min
return a<b?a:b;
}
inline int end(int &flow){//flow求最大流
int p,u,Min=1e9,ans=;
for(u=t;u!=s;u=e[p^].v){//因为开始值为0,可以用xor来找反边
p=pre[u];//往前找
Min=min(Min,e[p].c);//找全部经过水管都能流过的最大流 }
for(u=t;u!=s;u=e[p^].v){
p=pre[u];
e[p].c-=Min;
e[p^].c+=Min;
ans+=e[p].w*Min;//加费用
}
flow+=Min;//加最大流
return ans;
}
inline int solve(int &flow){
int ans=;
while(spfa()){
ans+=end(flow);
}
return ans;
}
}Flow;
inline void work(){
n=read();m=read();
s=read();t=read();
for(int i=;i<=n;i++)head[i]=-;//初始值为-1,方便xor
for(int i=;i<=m;i++){
int u=read(),v=read(),c=read(),w=read();
Flow.add(u,v,c,w);
}
int flow=;
int ans=Flow.solve(flow);
printf("%d %d\n",flow,ans);
}
int main(){
work();
return ;
}

题解 洛谷 P3381 【【模板】最小费用最大流】的更多相关文章

  1. 洛谷P3381 (最小费用最大流模板)

    记得把数组开大一点,不然就RE了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 ...

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

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

  3. P3381 [模板] 最小费用最大流

    EK  + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...

  4. 【洛谷 p3381】模板-最小费用最大流(图论)

    题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...

  5. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  6. 网络流_spfa最小费用最大流

    最大流: 不断搜索增广路,寻找最小的容量-流量,得到最大流量,但最大流量在有花费时不一定是最小花费. 最小费用最大流 算法思想: 采用贪心的思想,每次找到一条从源点到达汇点的花费最小的路径,增加流量, ...

  7. 洛谷P3381 - 【模板】最小费用最大流

    原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...

  8. 洛谷P3381 最小费用最大流模板

    https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...

  9. P3381 【模板】最小费用最大流(MCMF)

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

随机推荐

  1. laravel 模板

    1.{!! $data !!}  $data不会被转义

  2. HDU 2842 Chinese Rings( 递推关系式 + 矩阵快速幂 )

    链接:传送门 题意:解 N 连环最少步数 % 200907 思路:对于 N 连环来说,解 N 连环首先得先解 N-2 连环然后接着解第 N 个环,然后再将前面 N-2 个环放到棍子上,然后 N 连环问 ...

  3. 【NOI2001】食物链

    [NOI2001]食物链 题意 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B ...

  4. db2 -- 存储过程01

    接下来项目在技能可能偏向数据库方面,补习下. 学习写第一个db2在存储过程,记录下. ---- stored procedures code CREATE OR REPLACE PROCEDURE & ...

  5. 再识Quartz

    在之前的项目中使用过Quartz,但都是基于XML配置定义任务的.目前一个项目应用需要对任务进行创建.暂停.删除等动态管理.所以再次在网上翻了翻,再来好好重新认识下Quartz. 名词解释: sche ...

  6. 在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性

    在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性 Maven 项目生成jar运行时提示“没有主清单属性” 新建了一个Maven的项目,mvn compile和mvn packag ...

  7. hdu1290

    由二维的切割问题可知,平面切割与线之间的交点有关,即交点决定射线和线段的条数,从而决定新增的区域数. 当有n-1个平面时,切割的空间数为f(n-1).要有最多的空间数.则第n个平面需与前n-1个平面相 ...

  8. extjs 时间范围选择的实现

    extjs中 有时须要选择一个日期范围 ,须要自己主动推断,选择的開始日期不能大于结束日期,或结束日期不能小于開始日期,实现的代码例如以下 效果图: watermark/2/text/aHR0cDov ...

  9. Wireshark默认不抓取本地包的解决方式

    事实上这个工具我已经用过非常多年了,还叫Ethereal的时候就在用. 今天因为实验须要,要抓一下在localhost间的包,结果发现获取不到.解决方法也非常easy,在cmd下输入: route a ...

  10. 蚁视新家show,小伙伴们快来增加有范儿有爱的蚁视大家庭吧!

    蚁视搬新家啦.新家在学院路上,离中关村非常近.离宇宙的中心非常近,离好多同学也非常近有木有! 新家绝对是超级创客范儿,绝对理想中的工作环境有木有!愿意增加蚁视的小伙伴们.快快来吧! 以下是蚁视新办公室 ...