最大流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)明显高于前者,具体是怎 ...
随机推荐
- 【单调队列优化】[CF372C] Watching Fireworks is Fun
突然发现我可能单调队列都打不来了...我太菜了... 这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$ 则$ans=\sum_{i=1}^{m ...
- 尝试让Virtualbox的Ubuntu可以调整分辨率
在Virtualbox安装的Ubuntu,默认不是全屏,操作起来不是很方便,网上查了资料,按照网上的教程来操作并记录下自己的操作记录. 在安装的Ubuntu的虚拟机,通过 "设备" ...
- .net Core使用EFCore连接数据库
一.SQL Service 1.创建实体类 public class Student { public int Id { get; set; } [Required] [Display(Name =& ...
- 解析Spring MVC上传文件
新建一个普通的maven工程 在pom.xml文件中引入相应的坐标 <?xml version="1.0" encoding="UTF-8"?> & ...
- redis集群报错:(error) MOVED 5798 127.0.0.1:7001
原因 这种情况一般是因为启动redis-cli时没有设置集群模式所导致. 解决方案 启动时使用-c参数来启动集群模式,命令如下: redis-cli -c -p 7000 测试 127.0.0.1:7 ...
- 【原理】LVM(Logical Volume Manager)动态卷管理
一张图让你学会LVM 导读 随着科技的进步,人们不知不觉的就进入了大数据的时代,数据的不断增加我们发现我们的磁盘越来越不够用了,接下来就是令人头疼的事情--加硬盘,数据的备份与还原.LVM就是Li ...
- MetalLB自建私有Kubernetes的LoadBalancer负载均衡类型服务
简介 在私有网络上运行 Kubernetes,和御三家相比,对 LoadBalancer 类型的服务的支持应该是众多表面差异中最醒目的一个了.类型为 LoadBalancer 的服务在 Kuberne ...
- LeetCode 196. Delete Duplicate Emails (删除重复的电子邮箱)
题目标签: 题目给了我们一个 email 的表格,让我们删除重复的. 建立Person p1,Person p2,当email 相同时,而且 p1 id 要大于 p2 id 时候,删除这一行. Jav ...
- iOS开发UIResponder之NSUndoManager
1.简介 UIResponder有个属性:NSUndoManager @property(nullable, nonatomic,readonly) NSUndoManager *undoManage ...
- [转]C# 将类的内容写成JSON格式的字符串
将类的内容写入到JSON格式的字符串中 本例中建立了Person类,赋值后将类中内容写入到字符串中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using System; ...