费用流模版:

 #include<cstdio>
#include<cstring>
#include<queue>
using namespace std; const int Maxm=;//最大边数
const int Maxn=;//最大点数
struct Edge{
Edge(){};
Edge(int a,int b,int c,int d,int e){
u=a;
v=b;
f=c;
w=d;
nxt=e;
}
int u,v,f,w,nxt;//U当前点 V来自点 F最大流量 W费用 NXT下一个点
};
int cnt=;//边计数
int inf=;//无限大
int g[Maxn+];//点的边集的开始序号
Edge e[Maxm+];//边集
int dist[Maxn+];//费用
int src,sink;//源点与汇点
queue<int> que;//宽搜队列
bool inque[Maxn+];//宽搜判断标志
int from[Maxn+];//来源->用于计算费用
int ans=;//存储最小费用 inline int remin(int a,int b){
return a<b?a:b;
} inline void insert(int u,int v,int f,int w){
cnt++;
e[cnt]=Edge(u,v,f,w,g[u]);
g[u]=cnt;//增加一个边
} inline void addEdge(int u,int v,int f,int w){
insert(u,v,f,w);//插入正边
insert(v,u,,-w);//插入反边
} inline bool spfa(){
while (!que.empty()) que.pop();//清空队列
for (int i=;i<=sink;i++) dist[i]=inf;//清最大值
que.push(src);
inque[src]=true;
dist[src]=;//加入源点
//标准SPFA计算最短路 流量作为通行标准,费用作为路径长度
while(!que.empty()){
int now=que.front();
que.pop();
for (int i=g[now];i;i=e[i].nxt){
if (e[i].f!= && dist[e[i].v]>dist[now]+e[i].w){
dist[e[i].v]=dist[now]+e[i].w;
from[e[i].v]=i;
if (inque[e[i].v]==false){
inque[e[i].v]=true;
que.push(e[i].v);
}
}
}
inque[now]=false;
}
if (dist[sink]==inf) return false;//无法在增广
return true;
} inline void calcAns(){
int minflow=inf;
for (int i=from[sink];i;i=from[e[i].u]) minflow=remin(minflow,e[i].f);//寻找整条路经的流量
for (int i=from[sink];i;i=from[e[i].u]) {
e[i].f-=minflow;//正边减流量
e[i^].f+=minflow;//反边加流量
ans+=e[i].w*minflow;//计算费用
}
} inline void minCostFlow(){
while(spfa())calcAns();
} int main(){
minCostFlow();
return ;
}

网络流模版:

 #include<cstdio>
#include<cstring>
#include<queue>
using namespace std; const int Maxm=;//最大边数
const int Maxn=;//最大点数
struct Edge{
Edge(){};
Edge(int a,int b,int c,int d,int e){
u=a;
v=b;
f=c;
w=d;
nxt=e;
}
int u,v,f,w,nxt;//U当前点 V来自点 F最大流量 W费用 NXT下一个点
};
int cnt=;//边计数
int inf=;//无限大
int g[Maxn+];//点的边集的开始序号
Edge e[Maxm+];//边集
int dist[Maxn+];//费用
int src,sink;//源点与汇点
queue<int> que;//宽搜队列
bool inque[Maxn+];//宽搜判断标志
int from[Maxn+];//来源->用于计算费用
int ans=;//存储最小费用 inline int remin(int a,int b){
return a<b?a:b;
} inline void insert(int u,int v,int f,int w){
cnt++;
e[cnt]=Edge(u,v,f,w,g[u]);
g[u]=cnt;//增加一个边
} inline void addEdge(int u,int v,int f,int w){
insert(u,v,f,w);//插入正边
insert(v,u,,-w);//插入反边
} inline bool spfa(){
while (!que.empty()) que.pop();//清空队列
for (int i=;i<=sink;i++) dist[i]=inf;//清最大值
que.push(src);
inque[src]=true;
dist[src]=;//加入源点
//标准SPFA计算最短路 流量作为通行标准,费用作为路径长度
while(!que.empty()){
int now=que.front();
que.pop();
for (int i=g[now];i;i=e[i].nxt){
if (e[i].f!= && dist[e[i].v]>dist[now]+e[i].w){
dist[e[i].v]=dist[now]+e[i].w;
from[e[i].v]=i;
if (inque[e[i].v]==false){
inque[e[i].v]=true;
que.push(e[i].v);
}
}
}
inque[now]=false;
}
if (dist[sink]==inf) return false;//无法在增广
return true;
} inline void calcAns(){
int minflow=inf;
for (int i=from[sink];i;i=from[e[i].u]) minflow=remin(minflow,e[i].f);//寻找整条路经的流量
for (int i=from[sink];i;i=from[e[i].u]) {
e[i].f-=minflow;//正边减流量
e[i^].f+=minflow;//反边加流量
ans+=e[i].w*minflow;//计算费用
}
} inline void minCostFlow(){
while(spfa())calcAns();
} int main(){
minCostFlow();
return ;
}

费用流&网络流模版的更多相关文章

  1. BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流

    https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...

  2. BZOJ 3130: [Sdoi2013]费用流 网络流 二分 最大流

    https://www.lydsy.com/JudgeOnline/problem.php?id=3130 本来找费用流的题,权当复习一下网络流好了. 有点麻烦的是double,干脆判断大小或者二分增 ...

  3. BZOJ 3130: [Sdoi2013]费用流 网络流+二分

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1230  Solved: ...

  4. BZOJ 3130 [Sdoi2013]费用流 ——网络流

    [题目分析] 很容易想到,可以把P放在流量最大的边上的时候最优. 所以二分网络流,判断什么时候可以达到最大流. 流量不一定是整数,所以需要实数二分,整数是会WA的. [代码] #include < ...

  5. BZOJ 4213 贪吃蛇 上下界费用流 网络流

    https://darkbzoj.cf/problem/4213 https://www.cnblogs.com/DaD3zZ-Beyonder/p/5733326.html 题目描述 dbzoj又崩 ...

  6. LG2770/LOJ6122 航空路线问题 费用流 网络流24题

    问题描述 LG2770 LOG6122 题解 教训:关掉流同步之后就不要用其他输入输出方式了. 拆点. 两个拆点之间连\((1,1)\),其他连\((1,0)\) \(\mathrm{Code}\) ...

  7. BZOJ 1283 序列 费用流 网络流 线性规划

    https://darkbzoj.cf/problem/1283 给出一个长度为N的正整数序列Ci,求一个子序列,使得原序列中任意长度为M的子串中被选出的元素不超过K(K,M<=100) 个,并 ...

  8. 洛谷P4003 无限之环(infinityloop)(网络流,费用流)

    洛谷题目传送门 题目 题目描述 曾经有一款流行的游戏,叫做 Infinity Loop,先来简单的介绍一下这个游戏: 游戏在一个 n ∗ m 的网格状棋盘上进行,其中有些小方格中会有水管,水管可能在格 ...

  9. 【网络流24题】最长k可重线段集(费用流)

    [网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...

随机推荐

  1. ceph基本操作整理

    一.ceph基本操作: 启动osd.mon进程: start ceph-osd id=X start ceph-mon id=YYY 关闭osd.mon进程: stop  ceph-osd id=X ...

  2. ASP.NET页面之间数据传递的几种方法

    1)Request.QueryString   在ASP时代,这个是较常用的方法,到了ASP.NET,好像用的人不多了,但是不管怎么说,这是一个没有过时,且很值得推荐的方法,因为不管是ASP还是ASP ...

  3. Servlet 的基本架构

    import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...

  4. C语言(1)--准备

    经过很长一段时间的准备,终于重新弄懂了一些C语言的问题,再次熟悉了C语言的大致应用,对此略有体会,在此以博客记录于此! 准备工作: 运行平台:Linux 编辑工具:vim (还可以使用emac,ged ...

  5. KVO 的使用和举例

    KVO(key-value Observer),通过命名可以联想到,一个监视着监视着键值配对,让一个对象A来监视另一个对象B中的键值,一旦B中的受监视键所对应的值发生了变化,对象A会进入一个回调函数, ...

  6. 读取IOS的相应路径

    //    IOS相应路径 NSString* bundlePath = [[NSBundle mainBundle] bundlePath]; NSLog(@"bundlePath = % ...

  7. 帝国cms7.0 列表模板调用本栏目缩略图

    [e:loop={"select classimg from phome_enewsclass where classid='$GLOBALS[navclassid]'",1,24 ...

  8. 如何管理安卓android手机下google(谷歌)的通讯录联系人账户

    andorid手机都自带通讯录备份功能,但是如何管理,一直是一些人头疼的问题.经常在手机备份还原之后发现很多联系人都有重复. 1.打开 :https://mail.google.com/ 用你的谷歌账 ...

  9. 使用libcurl POST数据和上传文件

    为了具有通用性,将文件的内容读到了fc变量中,fclen是fc的长度.fc也可以是任何其它内容.curl 是 libcurl句柄.演示省略了很多显而易见的步骤.   1. 普通的post请求,这里用c ...

  10. Servlet 基础知识

    8.Response  8.1.getOutputStream和getWriter方法分别用于得到输出二进制数据.输出文本数据的ServletOutputStream .Printwriter对象.  ...