明天省夏要讲网络流啦!晚上翻出自己的模板发现是蓝书模板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. thinkphp助手函数

    tp3 C($name=null, $value=null,$default=null) 获取和设置配置参数 支持批量定义 load_config($file,$parse=CONF_PARSE) 加 ...

  2. python——pandas基础

    参考: 实验楼:https://www.shiyanlou.com/courses/1091/learning/?id=6138 <利用python进行数据分析> pandas简介 Pan ...

  3. lib 和 dll 的区别、生成以及使用详解 ~~包含示例代码~~(转)

    原文章地址:https://www.cnblogs.com/TenosDoIt/p/3203137.html#c 首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代码共享的方 ...

  4. shell脚本中关于日期的操作

    一.计算指定日期的前一天的日期 date -d "yesterday 20150401 " +%Y%m%d 二.如果获取当前日期的前一天        date -d " ...

  5. ps使logo背景色透明

    方法一:魔法工具(对复杂的logo误差较大) 魔法工具--左键点击选区--delete--保存 方法二:拾色器 1.有的站上的素材图片不能直接用,需要先变成rgb图像,可这样操作:图像\模式,选择rg ...

  6. leetcood学习笔记-168-excel表列名称

    题目描述: 方法一:asiic码 class Solution: def convertToTitle(self, n: int) -> str: if (n-1)//26 == 0: retu ...

  7. leetcood学习笔记-104-二叉树的最大深度

    题目描述: 第一次提交: class Solution(object): def maxDepth(self, root): """ :type root: TreeNo ...

  8. Java中的线程Thread方法之---join()

    上一篇我们说到了Thread中的stop方法,这一篇我们再来看一下方法join的使用,那么方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. join方法从字面上的意 ...

  9. JZOJ5153:树形图求和

    Description Input Output HINT 题解: 一种很直观的想法是通过矩阵生成树求树形图方法数ans以及不包含某一条边i的树形图方法数ans[i],则答案为Σ(ans-ans[i] ...

  10. vue wabpack 切换开发环境 和生成环境 的接口地址

    /config/dev.env.js 新增一行 var merge = require('webpack-merge') var prodEnv = require('./prod.env') mod ...