最大流Dinic算法的一些优化 [网络流][最大流]
明天省夏要讲网络流啦!晚上翻出自己的模板发现是蓝书模板QwQ。。拿出以前的提交代码(AC过的?)
曾经的提交记录

在luogu上重新提交一遍,结果gg...OVO
没有去除多余的inline
去除了多余的inline
论强数据练考验模板的好处?
于是决定自造一份正常的模板。。。
主要的优化有三——
(1) 当前弧优化,防止因重复访问一条边造成效率降低。
(2) 记录无法增广的点。
(3) 玄学优化?在Dinic的bfs过程中找到一条可增广的路径就返回(由于bfs的低效?),此优化在luogu的数据中表现良好。
具体可以看注释
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f int read(){
bool flag=;
char ch;
int re=;
while((ch=getchar())!='-'&&(ch<''||ch>''));
ch=='-'?flag=:re=ch-'';
while((ch=getchar())>=''&&ch<='') re=re*+ch-'';
return flag?-re:re;
} struct edge{
int to,nxt,cap;
edge(int to=,int nxt=,int cap=):
to(to),nxt(nxt),cap(cap){}
}; const int maxn=,maxm=; int n,m,s,t,cnt=;
int tou[maxn],head[maxn],q[maxn],d[maxn];
edge edges[maxm<<]; //增加一条流量为c的正向边和流量为0的反向边
//利于记录边的流量状态
inline void add_edge(int from,int to,int c){
edges[++cnt]=edge(to,head[from],c);
head[from]=cnt;
edges[++cnt]=edge(from,head[to],);
head[to]=cnt;
} void init(){
n=read(); m=read(); s=read(); t=read();
for(int i=,from,to,c;i<m;i++){
from=read(); to=read(); c=read();
add_edge(from,to,c);
}
} //寻找增广路
bool bfs(){
memset(d,-,(n+)<<);
d[t]=; q[]=t;
int hh=,tt=;
while(hh!=tt){
int cur=q[hh++];
for(int e=head[cur];e;e=edges[e].nxt){
int curto=edges[e].to;
if(d[curto]==-&&edges[e^].cap){
//printf("%d\n",curto);
d[curto]=d[cur]+;
q[tt++]=curto;
//找到一条边就返回,玄学优化?
if(curto==s) return ;
}
}
}
//没有玄学优化的写法,有了玄学优化是不是该return 0?
return d[s]!=-;
} int dfs(int x,int f){
if(f<=) return ;
if(x==t) return f;
int ca=;
//神秘的当前弧优化
for(int& e=head[x];e;e=edges[e].nxt){
int curto=edges[e].to;
//并不是之前的dfs()中找到的增广路啊
if(d[curto]+!=d[x]) continue;
//利用限制流量
int w=dfs(curto,(edges[e].cap<f-ca)?edges[e].cap:(f-ca));
//直接对路的流量进行修改
edges[e].cap-=w; edges[e^].cap+=w; ca+=w;
//已达到了限制流量
if(ca==f) break;
}
//已经gg的寻找
if(!ca) d[x]=-;
return ca;
} int dinic(){
int ans=;
//****当前弧优化的必要操作
memcpy(tou,head,(n+)<<);
while(bfs()){
ans+=dfs(s,inf);
memcpy(head,tou,(n+)<<);
}
return ans;
} int main(){
//freopen("temp.in","r",stdin);
init();
printf("%d\n",dinic());
return ;
}
亲测表现良好。。。

最大流Dinic算法的一些优化 [网络流][最大流]的更多相关文章
- 网络流之最大流Dinic算法模版
/* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...
- [讲解]网络流最大流dinic算法
网络流最大流算法dinic ps:本文章不适合萌新,我写这个主要是为了复习一些细节,概念介绍比较模糊,建议多刷题去理解 例题:codevs草地排水,方格取数 [抒情一下] 虽然老师说这个多半不考,但是 ...
- Power Network(网络流最大流 & dinic算法 + 优化)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24019 Accepted: 12540 D ...
- 网络流(最大流-Dinic算法)
摘自https://www.cnblogs.com/SYCstudio/p/7260613.html 网络流定义 在图论中,网络流(Network flow)是指在一个每条边都有容量(Capacity ...
- 网络流最大流——dinic算法
前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...
- 学习笔记 --- 最大流Dinic算法
为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...
- hdu-3572 Task Schedule---最大流判断满流+dinic算法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...
- 最大流Dinic算法
嘿嘿嘿,时隔不久又见到了DInic,再次回顾一下吧 不过这次我倒是不想深究,而是想多做一些题,因为这几次比赛下来,算法不是重点,重点是题目如何转化,算法如何应用,这也是比赛为什么让你带着板子的原因吧, ...
- 最大流——Dinic算法
前面花了很长时间弄明白了压入-重标记的各种方法,结果号称是O(V3)的算法测demo的时候居然TLE了一个点,看了题解发现所有人都是用Dinic算法写的,但它的复杂度O(V2E)明显高于前者,具体是怎 ...
随机推荐
- kali环境配置
1.配置源及刷新软件列表 建议用官方默认源: # vi /etc/apt/sources.list deb http://http.kali.org/kali kali-rolling main no ...
- awk与sed命令面试题整理
1.sed命令123abc456456def123567abc789789def567要求输出:456ABC123123DEF456789ABC567567DEF789答案:sed -r -i 's# ...
- js实现截取字符串后几位
var strs ="wdsdabcdefages" strs.substring(obj.filename.lastIndexOf("a")+1,strs.l ...
- Sql Server 小知识不断扩充中
1. char.varchar.nvarchar 区别 char 定长字符数据长度8000字符,小于8000字符时以空格填充. varchar 变长字符数据最大长度8000,小于8000字符时不会以 ...
- 【NIO】NIO之浅谈内存映射文件原理与DirectMemory
Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原 ...
- 矩阵乘法分配律+bitset优化——hdu4920
因为是模3,所以把原矩阵拆成两个01矩阵,然后按分配律拆开分别进行矩阵乘法,行列用bitset来存进行优化即可 注意 int bitset<int>::count() 函数可以统计bits ...
- mysql在win系统dos 安装版配置步骤详解
1.准备工作 下载mysql的最新免安装版本mysql-noinstall-5.1.53-win32.zip,解压缩到相关目录,如:d:\ mysql-noinstall-5.1.53-win32.这 ...
- NX二次开发-UFUN创建表达式UF_MODL_create_exp_tag有TAG
NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建一个新的表达式,无TAG UF_MOD ...
- Core Text 入门
本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Core Text的测试项 ...
- iOS 点击Application icon加载推送通知Data
今天做APNS远程推送通知遇到了一个问题,就是手机接收到通知的时候,如果马上点击通知的 alert view时候,系统马上唤醒你的Application,通知或调用你的didReceiveLocalN ...