最大流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)明显高于前者,具体是怎 ...
随机推荐
- 内网渗透_win_socks代理_reGeorg+proxifier
遇到内网windows机器,如果想远程登陆,通常得通过代理,常用的nc.lcx 工具可满足要求. 如 lcx 示例: 两台机器上均上传lcx.exe 在 xp机器(公网)上执行 lcx.exe -li ...
- java oop第11章_反射、BaseDao的进一步改造
引言:从Java5开始,Java中引用了一个新的概念反射,当程序运行时,能动态感知到程序中拥有的所以信息,这个获取信息的过程是采用反射机制来完成. 一. Class类: Class类用 ...
- java反射机制以及应用
JAVA反射机制+动态运行编译期不存在的JAVA程序 一.有关JAVA反射 在运行期间,在不知道某个类A的内部方法和属性时,能够动态的获取信息.获取类或对象的方法.属性的功能,称之为反射. 1.相关类 ...
- 最基础知识 sql之left join、right join、inner join的区别
sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括 ...
- Homestead 安装其它的PHP版本
运行环境: 系统: win10 软件: virtualbox 6.2 vagrant 2.2.4 homestead 7.1.0 sudo apt-get update sudo apt-get -y ...
- PagedLOD模型对象选择关键技术点
DatabaseCacheReadCallback这个类继承ReadCallback,在相交的测试中,场景可能有PagedLOD,而计算相交过程中,PagedLOD不是精度最高的节点,这样计算的就不准 ...
- scala中函数简单使用记录
object funcHighLevel { def main(args: Array[String]): Unit = { // 创建一个匿名函数 val sayFunc = (name: Stri ...
- Oracle分页:工作记录
Oracle分页:传入值为List<String> . Mybatis XXXMapper.xml SELECT * FROM ( SELECT ROWNUM rn, t1.cardnum ...
- JQuery简单实用的模板引擎
1.在html界面声明模板(注意type类型) <script id="tmplInvokeProvider" type="text/x-jquery-tmpl&q ...
- GDI+图像与GDI位图的相互转换
Delphi的TBitmap封装了Windows的GDI位图,因此,TBitmap只支持bmp格式的图像,但是在Delphi应用程序中,常常会遇到图形格式的转换,如将Delphi位图TBitmap的图 ...