[模板]网络最大流 & 最小费用最大流
我的作业部落有学习资料
Dinic 模板
#define rg register
#define _ 10001
#define INF 2147483647
#define min(x,y) (x)<(y)?(x):(y)
using namespace std;
int n,m,s,t,record[_],num_of_edges=-,cur[_],team[],depth[_];
struct pp
{
int next,to,w;
}edge[(_<<)+(_<<)];
inline int read()
{
rg int save=,w=;rg char q=getchar();
while(q<''||q>''){if(q=='-')w=-;q=getchar();}
while(q>=''&&q<='')save=(save<<)+(save<<)+q-'',q=getchar();
return save*w;
}
inline void add(rg int from,rg int to,rg int ww)
{
edge[++num_of_edges]=(pp){record[from],to,ww};
record[from]=num_of_edges;
}
inline bool bfs()
{
rg int head=,tail=;
for(rg int i=;i<=n;++i)depth[i]=;//depth[]初值为-1,免得返回出发点
depth[s]=;
team[]=s;
do
{
head++;
rg int u=team[head];
for(rg int j=record[u];j!=-;j=edge[j].next)
{
rg int to=edge[j].to;
if((!depth[to])&&(edge[j].w>))
{
depth[to]=depth[u]+;
team[++tail]=to;
if(to==t)return ;
}
}
}while(head<tail);
return ;
}
int dfs(rg int u,rg int flow)//找到每条路上的最小残余流量,因此需在回溯时更新每条边的流量
{
if(u==t)return flow;
for(rg int &j=cur[u]/*当前弧优化*/;j!=-;j=edge[j].next)
{
rg int to=edge[j].to;
if(depth[to]==depth[u]+&&(edge[j].w>))
{
rg int D=dfs(to,min(flow,edge[j].w));//到终点的过程中一直在取min
if(D>)
{
edge[j].w-=D,edge[j^].w+=D;
return D;//每次只找一条可流通路满上(这里就不管现实中物理的联通器原理了)
} }
}
return ;
}
inline int Dinic()
{
rg int i,j,ans=;
while(bfs())
{
for(i=;i<=n;++i)cur[i]=record[i];
while(int now=dfs(s,INF))ans+=now;
}
return ans;
}
int main()
{
n=read(),m=read(),s=read(),t=read();
rg int i,j;
for(i=;i<=n;++i)record[i]=-;
for(i=;i<=m;++i)
{
rg int x=read(),y=read(),ww=read();
add(x,y,ww),add(y,x,);
}
printf("%d\n",Dinic());
return ;
}
最小费用最大流:
#define rg register
#define _ 5001
#define __ 50001
#define INF 2147483647
using namespace std;
int n,m,s,t,record[_],num_of_edges=,pre[_],res_flow,res_cost,dis[_],team[__<<];//以后num_of_edges都赋为 1 !!!
bool exist[_];
struct pp
{
int next,to,w,cost;
}edge[__<<];
inline int read()
{
rg int save=,w=;rg char q=getchar();
while(q<''||q>''){if(q=='-')w=-;q=getchar();}
while(q>=''&&q<='')save=(save<<)+(save<<)+q-'',q=getchar();
return w*save;
}
inline void add(rg int from,rg int to,rg int ww,rg int f)
{
edge[++num_of_edges]=(pp){record[from],to,ww,f};
record[from]=num_of_edges;
}
inline bool SPFA()
{
rg int head=,tail=;
for(rg int i=;i<=n;++i)exist[i]=,dis[i]=INF;
dis[s]=;
team[]=s;
do
{
head++;
rg int i=team[head];
exist[i]=;
for(rg int j=record[i];j;j=edge[j].next)
{
rg int to=edge[j].to;
if(edge[j].w>&&dis[to]>dis[i]+edge[j].cost)
{
dis[to]=dis[i]+edge[j].cost;
pre[to]=j;
if(!exist[to])team[++tail]=to,exist[to]=;
}
}
}while(head<tail);
return dis[t]!=INF;
}
inline void doit()
{
while(SPFA())
{
rg int flow=INF;
for(rg int i=pre[t];i;i=pre[edge[i^].to])
flow=min(flow,edge[i].w);
res_flow+=flow;
res_cost+=dis[t]*flow;
for(rg int i=pre[t];i;i=pre[edge[i^].to])
edge[i].w-=flow,edge[i^].w+=flow;
}
printf("%d %d\n",res_flow,res_cost);
}
int main()
{
n=read(),m=read(),s=read(),t=read();
rg int i,j;
for(i=;i<=m;++i)
{
rg int u=read(),v=read(),w=read(),f=read();
add(u,v,w,f),add(v,u,,-f);
}
doit();//实在不想用那个MCMF()
return ;
}
[模板]网络最大流 & 最小费用最大流的更多相关文章
- BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)
第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然 后跑最小费用最大流就OK了. ---- ...
- bzoj 1834: [ZJOI2010]network 网络扩容【最大流+最小费用最大流】
第一问直接跑最大流即可.建图的时候按照费用流建,费用为0. 对于第二问,在第一问dinic剩下的残量网络上建图,对原图的每条边(i,j),建(i,j,inf,cij),表示可以用c的花费增广这条路.然 ...
- 最大流 && 最小费用最大流模板
模板从 这里 搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...
- BZOJ1834 [ZJOI2010]network 网络扩容(最小费用最大流)
挺直白的构图..最小费用最大流的定义. #include<cstdio> #include<cstring> #include<queue> #include< ...
- 洛谷P2604 最大流+最小费用最大流
题目链接:https://www.luogu.org/problem/P2604 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在 ...
- POJ - 2516 Minimum Cost(最小费用最大流)
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...
- P3381 【模板】最小费用最大流
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...
- 【网络流#2】hdu 1533 - 最小费用最大流模板题
最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...
- 洛谷P3381 最小费用最大流模板
https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
随机推荐
- 安装weblogic界面安装
如果中间有任何问题请联系作者:291562721 界面安装weblogic首先 需要工具: 链接:https://pan.baidu.com/s/1x3uYxsnycjT2Xi2TOTbDdQ 提取码 ...
- OC学习--OC中的类--类的定义,成员变量,方法
1. 类的定义 >用关键字@interface进行声名 @end 结束 >所有的类有一个基类NSobject >类名 也是标示符 第一个字母大写 如果多个字母组成 每个单词的首字母 ...
- 08.Linux系统启动root密码忘记及文件系统故障问题
问题:root用户密码忘记了,在重置root密码时,出现文件系统故障,没有root密码进不去,怎么办? Error:UNEXPECTED INCONSISTENCY;RUN fsck MANUALIY ...
- ThreadLocal的原理
ThreadLocal是一个支持泛型的java类,抛开里面的静态内部类ThreadLocalMap不说,其实它没几行代码,不信,您自己去看看.它用来干啥?类上注释说的很明白: 它能让线程拥有了自己内部 ...
- MySQL优化系列之一
MySQL数据库常见的两个瓶颈是CPU和I/O. CPU在饱和的情况下一般发生在数据装入内存或者从磁盘上读取数据的时候,当装入的数据远大于 内存容量的时候,这时可能会发生I/O瓶颈, 如果是分布式应用 ...
- 190行代码实现mvvm模式
前言 网上讲 vue 原理,mvvm 模式的实现,数据双向绑定的文章一搜一大堆,不管写的谁好谁坏,都是写的自己的理解,我也发一篇文章记录自己的理解,如果对看官有帮助,那也是我莫大的荣幸,不过看完之后, ...
- JS基础入门篇(四十三)—ES6(二)
1.对象简洁表示法 原来写法 var name = "lzf"; var gender = "male"; var fn = function(){consol ...
- Redis服务器中有75%受到恶意软件感染
尽管由于配置错误的服务器和应用程序而导致新的网络攻击不断出现,但人们仍然忽略安全警告. 近两个月前,中国知名黑客组织东方联盟研究人员警告说,一项针对开放Redis服务器的大规模恶意软件活动现在已经发展 ...
- 安装electron-react-boilerplate遇到的问题
一.yarn安装缓慢 // 查看下载源 yarn config get registry // 修改下载源 yarn config set registry https://registry.npm. ...
- Go(三)面向对象
封装数据和行为 数据封装 结构定义 type Employee struct { Id string Name string Age int } field后面没有逗号 实例创建及初始化 e := E ...