明天省夏要讲网络流啦!晚上翻出自己的模板发现是蓝书模板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算法的一些优化 [网络流][最大流]的更多相关文章

  1. 网络流之最大流Dinic算法模版

    /* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...

  2. [讲解]网络流最大流dinic算法

    网络流最大流算法dinic ps:本文章不适合萌新,我写这个主要是为了复习一些细节,概念介绍比较模糊,建议多刷题去理解 例题:codevs草地排水,方格取数 [抒情一下] 虽然老师说这个多半不考,但是 ...

  3. Power Network(网络流最大流 & dinic算法 + 优化)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24019   Accepted: 12540 D ...

  4. 网络流(最大流-Dinic算法)

    摘自https://www.cnblogs.com/SYCstudio/p/7260613.html 网络流定义 在图论中,网络流(Network flow)是指在一个每条边都有容量(Capacity ...

  5. 网络流最大流——dinic算法

    前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...

  6. 学习笔记 --- 最大流Dinic算法

    为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...

  7. hdu-3572 Task Schedule---最大流判断满流+dinic算法

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...

  8. 最大流Dinic算法

    嘿嘿嘿,时隔不久又见到了DInic,再次回顾一下吧 不过这次我倒是不想深究,而是想多做一些题,因为这几次比赛下来,算法不是重点,重点是题目如何转化,算法如何应用,这也是比赛为什么让你带着板子的原因吧, ...

  9. 最大流——Dinic算法

    前面花了很长时间弄明白了压入-重标记的各种方法,结果号称是O(V3)的算法测demo的时候居然TLE了一个点,看了题解发现所有人都是用Dinic算法写的,但它的复杂度O(V2E)明显高于前者,具体是怎 ...

随机推荐

  1. 自记录:git如何上传文档到git@osc

    前提: D盘有gitserver文件夹 双击桌面的git.exe文件,打开git命令窗口 输入cd  d: 命令进入D盘 输入cd gitserver命令进入 找到git@osc自己参与项目里的htt ...

  2. Oracle之视图联合查询加排序问题

    在公司修改bug,有这样的需求:需要从两张视图中查出相同字段的数据,按照导师姓名先排序,再按照学号排序 union联合两张表,SELECT * from((SELECT DS_ID,PYLX_ID,Y ...

  3. [LOJ#2732] 「JOISC 2016 Day 2」雇佣计划

    参考博文 (不过个人感觉我讲的稍微更清楚一点) 题目就是让我们求图中满足数值大于等于B的连通块数量 然后我们可以尝试转换为求连通块两端所产生的“谷”的数量,显然一个连通块对谷可以贡献2的答案,最终答案 ...

  4. 笔记50 Mybatis快速入门(一)

    一.Mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  5. PHP算法之电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出:[" ...

  6. map方法的简单使用

    假设有一个数组a,将a中的数值以2倍的形式放到b数组中 <!DOCTYPE html> <html lang="en"> <head> < ...

  7. PKUSC订正

    Day1 T2:最大前缀和 枚举答案集合(不直接枚举答案数,相当于状态的离散化),这个集合成为答案当且仅当存在方案使得答案集合的排列后缀和>=0(如果<0就可以去掉显然更优),答案补集的前 ...

  8. NX二次开发-更改图纸尺寸内容(编辑文本)uc5566

    #include <uf.h> #include <uf_drf.h> #include <uf_obj.h> #include <uf_part.h> ...

  9. 杂项:ionic

    ylbtech-杂项:ionic ionic是一个用来开发混合手机应用的,开源的,免费的代码库.可以优化html.css和js的性能,构建高效的应用程序,而且还可以用于构建Sass和AngularJS ...

  10. 如何再windows里面装Tableau Server

    1.进入网页http://www.tableau.com/support/esdalt下载所需要的软件. 我的是正版下载的是 2.点击tableauServer-64bit-10....这个软件 一直 ...