[模板] 网络流相关/最大流ISAP/费用流zkw
最大流/ISAP
话说ISAP是真快...(大多数情况)吊打dinic,而且还好写...
大概思路就是: 在dinic的基础上, 动态修改层数, 如果终点层数 \(>\) 点数, break.
暂时并不知道isap有没有可能被卡. 应该不会
const int ninf=(int)1e9+500,psz=(int)450,esz=(int)1e5+50;
//network flow
struct te{int t,pr,fl;}edge[esz*2];
int hd[psz],pe=1,np,ss,tt; //np: number of points
void adde(int f,int t,int fl){edge[++pe]=(te){t,hd[f],fl};hd[f]=pe;}
void addsg(int f,int t,int fl){adde(f,t,fl);adde(t,f,0);} //add an unidirectional edge
void adddb(int f,int t,int fl){adde(f,t,fl);adde(t,f,fl);} //add a bi-directional edge
int d[psz],gap[psz],cur[psz];
void init(){ //bfs
rep(i,1,np)cur[i]=hd[i],gap[i]=0,d[i]=0;
static int que[psz],qh,qt;
qh=1,qt=0;
que[++qt]=tt,d[tt]=1,gap[1]=1;
while(qh<=qt){
int u=que[qh++];
for(int i=hd[u],v=edge[i].t;i;i=edge[i].pr,v=edge[i].t){
if(d[v])continue;
d[v]=d[u]+1,++gap[d[v]];
que[++qt]=v;
}
}
}
int dfs(int p,int mi){
if(mi==0||p==tt)return mi;
int fl=0,tmp;
for(int &i=cur[p],v=edge[i].t;i;i=edge[i].pr,v=edge[i].t){
if(d[v]+1!=d[p])continue;
tmp=dfs(v,min(edge[i].fl,mi));
fl+=tmp,mi-=tmp,edge[i].fl-=tmp,edge[i^1].fl+=tmp;
if(mi==0)return fl; //这个时候不需要修改d[p], 已经没有流量可以增广; 如果修改会wa,并不知道为什么,欢迎神仙指出
}
if(gap[d[p]]==1)d[ss]=np+1;
--gap[d[p]],++d[p],++gap[d[p]];
cur[p]=hd[p];
return fl;
}
int maxfl(){
int res=0;
init();
while(d[ss]<=np)res+=dfs(ss,ninf);
return res;
}
费用流/ZKW
跑的慢
const int psz=1e4+50,esz=1e5+50,ninf=1e9;
int n,m,s,t;
struct te{int t,c,v,pr;}edge[esz*2];
int hd[psz],pe=1,ss,tt,np;
void adde(int f,int t,int c,int v){edge[++pe]=(te){t,c,v,hd[f]};hd[f]=pe;}
void addsg(int f,int t,int c,int v){adde(f,t,c,v);adde(t,f,0,-v);}
int que[psz],qh=1,qt=0;
int mind[psz],cur[psz],vi[psz];
bool init(){
memcpy(cur,hd,(np+2)*4);
qh=1,qt=0;
rep(i,1,np)mind[i]=ninf,vi[i]=0;
que[++qt]=ss,mind[ss]=0,vi[ss]=1;
while(qh<=qt){
int u=que[qh%np];++qh,vi[u]=0;
for(int i=hd[u],v;i;i=edge[i].pr){
v=edge[i].t;
if(edge[i].c==0||mind[v]<=edge[i].v+mind[u])continue;
mind[v]=edge[i].v+mind[u];
if(vi[v]==0)++qt,que[qt%np]=v,vi[v]=1;
}
}
return mind[tt]<ninf;
}
int dfs(int p,int mi){
if(p==tt||mi==0)return mi;
vi[p]=1;
int fl=0,tmp;
for(int &i=cur[p],v;i;i=edge[i].pr){
v=edge[i].t;
if(mind[v]!=mind[p]+edge[i].v||edge[i].c==0||vi[v])continue;
tmp=dfs(v,min(mi,edge[i].c));
fl+=tmp,mi-=tmp,edge[i].c-=tmp,edge[i^1].c+=tmp;
if(mi==0)break;//important
}
vi[p]=0;return fl;
}
int ansc=0,ansf=0;
void mcmf(){
while(init()){
int tmp=dfs(ss,ninf);
ansf+=tmp,ansc+=tmp*mind[tt];
}
}
[模板] 网络流相关/最大流ISAP/费用流zkw的更多相关文章
- 【BZOJ1834】网络扩容(最大流,费用流)
[BZOJ1834]网络扩容(最大流,费用流) 题面 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下 ...
- 洛谷P3381 【模板】最小费用最大流(dijstra费用流)
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...
- 【BZOJ1834】network 网络扩容(最大流,费用流)
题意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. ...
- BZOJ1834 [ZJOI2010]network 网络扩容 【最大流,费用流】
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3394 Solved: 1774 [Subm ...
- luogu P5470 [NOI2019]序列 dp 贪心 费用流 模拟费用流
LINK:序列 考虑前20分 容易想到爆搜. 考虑dp 容易设\(f_{i,j,k,l}\)表示前i个位置 选了j对 且此时A选择了k个 B选择了l个的最大值.期望得分28. code //#incl ...
- 【洛谷 P2604】 [ZJOI2010]网络扩容(最大流,费用流)
题目链接 第一问就是简单的最大流. 第二问,保留第一问求完最大流的残量网络. 然后新建一个源点,向原源点连一条流量为k,费用为0的边. 然后所有边重新连一起(原来的边保留),费用为题目所给,最小费用即 ...
- HDU 5045(Contest-费用流)[template:费用流]
Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- hdu1533 费用流模板
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 【Codevs1237&网络流24题餐巾计划】(费用流)
题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 ...
随机推荐
- 细说addEventListener与事件捕获
细说addEventListener与事件捕获.事件冒泡(一)addEventListener的基本用法 在复杂的项目开发中,javascript和html的解耦变得至关重要,我们被推荐使用事件动态绑 ...
- vue 路由的使用
ue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用 ...
- 【Dojo 1.x】笔记2 使用服务器环境及使用模块
又开坑了.上次静态html页面完成本地module的引用,算是成功了,但是并不知道是怎么运作的,没关系慢慢来. 我用的环境是VSCode,这次因为官方说要在服务器环境下运行,所以就用上了VSCode的 ...
- Git:修改Git Bash默认打开位置(win10)
1.起因 大家写的代码不可能直接保存在根目录下,但是Git Bash每次一打开就是根目录,每次都要切换路径很麻烦. 2.修改Git Bash默认打开位置 1)Git Bash右键 -> 属性 2 ...
- Windows之MySQL安装教程
MySQL安装说明 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,My ...
- SQLServer数据事务日志操作
日志备份 (log backup) 包括以前日志备份中未备份的所有日志记录的事务日志备份. (完整恢复模式) 使用SSMS数据库管理工具备份事务日志 1.连接数据库,选择数据库->右键点击-&g ...
- Scheme来实现八皇后问题(1)
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/9768105.html 作者:窗户 Q ...
- 【Linux基础】查看硬件信息-CPU
1.物理CPU数:计算机上实际配置的CPU个数. //查看计算机物理CPU个数(必须先sort后uniq) cat /proc/cpuinfo | grep "physical id&quo ...
- 【Python 02】计算机与程序设计
计算机 根据一系列指令对数据进行处理的工具或机器. 特征: 可以进行计算 根据指令执行任务 组成: 运算器+控制器(CPU) 存储器(内存及硬盘):内存存储临时数据.硬盘存储相对永久的数据 输入设备和 ...
- Python爬虫【实战篇】bilibili视频弹幕提取
两个重要点 1.获取弹幕的url是以 .xml 结尾 2.弹幕url的所需参数在视频url响应的 javascript 中 先看代码 import requests from lxml import ...