费用流&网络流模版
费用流模版:
#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 ;
}
费用流&网络流模版的更多相关文章
- BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流
https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...
- BZOJ 3130: [Sdoi2013]费用流 网络流 二分 最大流
https://www.lydsy.com/JudgeOnline/problem.php?id=3130 本来找费用流的题,权当复习一下网络流好了. 有点麻烦的是double,干脆判断大小或者二分增 ...
- BZOJ 3130: [Sdoi2013]费用流 网络流+二分
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1230 Solved: ...
- BZOJ 3130 [Sdoi2013]费用流 ——网络流
[题目分析] 很容易想到,可以把P放在流量最大的边上的时候最优. 所以二分网络流,判断什么时候可以达到最大流. 流量不一定是整数,所以需要实数二分,整数是会WA的. [代码] #include < ...
- BZOJ 4213 贪吃蛇 上下界费用流 网络流
https://darkbzoj.cf/problem/4213 https://www.cnblogs.com/DaD3zZ-Beyonder/p/5733326.html 题目描述 dbzoj又崩 ...
- LG2770/LOJ6122 航空路线问题 费用流 网络流24题
问题描述 LG2770 LOG6122 题解 教训:关掉流同步之后就不要用其他输入输出方式了. 拆点. 两个拆点之间连\((1,1)\),其他连\((1,0)\) \(\mathrm{Code}\) ...
- BZOJ 1283 序列 费用流 网络流 线性规划
https://darkbzoj.cf/problem/1283 给出一个长度为N的正整数序列Ci,求一个子序列,使得原序列中任意长度为M的子串中被选出的元素不超过K(K,M<=100) 个,并 ...
- 洛谷P4003 无限之环(infinityloop)(网络流,费用流)
洛谷题目传送门 题目 题目描述 曾经有一款流行的游戏,叫做 Infinity Loop,先来简单的介绍一下这个游戏: 游戏在一个 n ∗ m 的网格状棋盘上进行,其中有些小方格中会有水管,水管可能在格 ...
- 【网络流24题】最长k可重线段集(费用流)
[网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
随机推荐
- iOS中Block介绍 基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...
- 自定义通用Distinct去除重复数据的2中方式
由于Lambda Distinct方法默认是按照集合里面的值比较的,所以当集合里面存放的是类的时候,我们一般是按照实体中的某一属性值比较,其实是用默认的Distinct也可以的,自己先定义一个实现了接 ...
- 安装cocopods 更新ruby
最近弄cocoapods出现如标题提示 So度娘一番.感谢作者.纯属学习没有商业用途 1.打开终端 终端输入 $ruby -v 查看ruby的版本 打印代码: ruby 2.0.0p648 (2 ...
- Android应用开发实例篇(1)-----简易涂鸦板
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378328.html 一.概述 这次要做一个简单的涂鸦板应用,以前在Qt上实现过,突然想 ...
- Java "double字符串转数字"
1.int 表示数字的简单类型(值类型),double 表示数字的双精度类型(值类型), 而Integer和Double类型是一个引用的复杂类型 2.Integer.valueOf(String s ...
- springmvc附件上传核心代码
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.Comm ...
- python函数any()与all()
any(iterable) all(iterable) any()与all()函数的区别,any是任意,而all是全部. 版本:该函数适用于2.5以上版本,兼容python3版本. any(itera ...
- C语言(1)--准备
经过很长一段时间的准备,终于重新弄懂了一些C语言的问题,再次熟悉了C语言的大致应用,对此略有体会,在此以博客记录于此! 准备工作: 运行平台:Linux 编辑工具:vim (还可以使用emac,ged ...
- Docker学习总结之Run命令介绍
Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...
- JAVA CAS单点登录(SSO)
一.教程前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Auth ...