费用流&网络流模版
费用流模版:
#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可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
随机推荐
- POJ训练计划1459_Power Network(网络流最大流/Dinic)
解题报告 这题建模实在是好建.,,好贱.., 给前向星给跪了,纯dinic的前向星居然TLE,sad.,,回头看看优化,.. 矩阵跑过了.2A,sad,,, /******************** ...
- eclipse或adt-bundle创建的android项目没有自动生成MainActivity.java和activity_main.xml等文件解决办法
以前我电脑一直以来都是用的eclipse3.7来开发android项目的,创建android项目也能正常生成MainActivity.java和activity_main.xml等文件.后来不知道什么 ...
- UVa1225 Digit Counting
#include <stdio.h>#include <string.h> int main(){ int T, N, i, j; int a[10]; sc ...
- 【Java】 实现一个简单文件浏览器(1)
学习Java的Swing的时候写的一个超简单文件浏览器 效果如图: 项目结构: 这里面主要用了两个控件,JTree和JTable 下面先说下左侧的文件树如何实现: 首先是FileTree类,继承于JT ...
- Struts学习之自定义结果集
转自:http://blog.csdn.net/hanxuemin12345/article/details/38763057 项目中我们经常遇到这样的需求——页面部分刷新,例如:添加用户,转到添加用 ...
- MSSQL随机数概率测试
随机概率测试 创建一个表统计create table t_test(ip char(15)) --truncate table t_test; declare @i int ;set @i=0; -- ...
- Git Version recovery command introduction - git reset
reset命令有3种方式: git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 git re ...
- Webx pull service
1.概述 pull service的功能是将对象置入模板中.被pull service放到模板中的对象,不需要应用程序的干预即可直接使用.如果模板没有用到某个对象,则不会产生创建该对象的开销.看起来, ...
- 前端笔试题2 JS部分
笔试题2 var EventME = {}; EventME.addHandle = function(ele, eventName, handleFunction) { if (ele.addEve ...
- Tensorflow 神经网络
Tensorflow让神经网络自动创造音乐 前几天看到一个有意思的分享,大意是讲如何用Tensorflow教神经网络自动创造音乐.听起来好好玩有木有!作为一个Coldplay死忠粉,第一想法就是自动生 ...