前言

突然发现到了新的一年什么东西好像就都不会了凉凉

算法步骤

  1. 建残量网络图
  2. 在残量网络图上跑增广路
  3. 重复1直到没有增广路(注意一个残量网络图要尽量把价值都用完,不然会浪费建图的时间)

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const int N=10010,M=100010,Inf=1e9+10;
int n,m,s,t,flow;
class Graph{
private:
    int front[N],nxt[M<<1],to[M<<1],w[M<<1],cnt,dep[N];
    bool bfs(){
        queue<int >Q;while(!Q.empty())Q.pop();
        memset(dep,0,sizeof(dep));
        Q.push(s);dep[s]=1;
        while(!Q.empty()){
            int u=Q.front();Q.pop();
            for(int i=front[u];i!=-1;i=nxt[i]){
                int v=to[i];
                if(!dep[v] && w[i]){
                    dep[v]=dep[u]+1;Q.push(v);
                }
            }
        }
        return dep[t];
    }
    int dfs(int u,int Flow){
        if(u==t || !Flow)return Flow;
        for(int i=front[u];i!=-1;i=nxt[i]){
            int v=to[i];
            if(dep[v]==dep[u]+1 && w[i]){
                int di=dfs(v,min(Flow,w[i]));
                if(di){
                    w[i]-=di;w[i^1]+=di;
                    return di;
                }
            }
        }
        return 0;
    }
public:
    void Add(int u,int v,int val){to[cnt]=v;nxt[cnt]=front[u];front[u]=cnt;w[cnt]=val;cnt++;}
    void init(){memset(front,-1,sizeof(front));cnt=0;}
    void Dinic(){
        while(bfs()){
            while(int d=dfs(s,Inf)){
                flow+=d;
            }
        }
    }
}MaxFlow;
int main(){
    n=gi();m=gi();s=gi();t=gi();
    MaxFlow.init();
    for(int i=1;i<=m;i++){
        int u=gi(),v=gi(),val=gi();
        MaxFlow.Add(u,v,val);MaxFlow.Add(v,u,0);
    }
    MaxFlow.Dinic();
    printf("%d\n",flow);
    return 0;
}

当前弧优化

考虑我们在dfs搜索的时候,是不是有什么东西重复了?
显然搜索过的就不可能再来了(因为已经被压榨干净了)
然后就可以修改一些dfs的过程。


int dfs(int u,int Flow){
    if(u==t || !Flow)return Flow;
    for(int &i=cur[u];i!=-1;i=nxt[i]){
        int v=to[i];
        if(dep[v]==dep[u]+1 && w[i]){
            int di=dfs(v,min(Flow,w[i]));
            if(di){
                w[i]-=di;w[i^1]+=di;
                return di;
            }
        }
    }
    return 0;
}
void Dinic(){
    while(bfs()){
        for(int i=1;i<=n;i++)cur[i]=front[i];
        while(int d=dfs(s,Inf)){
            flow+=d;
        }
    }
}

优化还是比较明显的。

大家可以在看完之后切了这道题目

当然陆续将会推出HLPP与ISAP的总结。

网络流——最大流Dinic算法的更多相关文章

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

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

  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算法模版

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

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

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

  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算法

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

  9. 求最大流dinic算法模板

    //最短增广路,Dinic算法 struct Edge { int from,to,cap,flow; };//弧度 void AddEdge(int from,int to,int cap) //增 ...

随机推荐

  1. IOS初级:AFNetworking

    狗 日的,第三方框架真j8难搞 1.为什么NS_ASSUME_NONNULL_BEGIN在6.2报错,你他么的还挑IDE,你这是什么态度? 2.还有,你他么的自动给老子转json了,有问过我么? #i ...

  2. Zxing2.1扫描取景框变形问题解决

    修改竖屏扫描的贴子,2.0之前的都很适用.可是到了2.1,有些贴子的做法可以将扫描框改为竖屏,但是取景框里扫描到的东西是变形的(扁的),本人仔细研究一番,终于解决了这个问题,下面贴出解决办法: 1.修 ...

  3. jvm 启动参数设置(转载)

    JVM启动参数 http://onlyor.iteye.com/blog/1722413 博客分类: java java java启动参数共分为三类其一是标准参数(-),所有的JVM实现都必须实现这些 ...

  4. mybatis-mysql类型映射

    JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...

  5. spring学习 八 面向切面编程(AOP)概述

    注:本文大部分参考   --------------------- 本文来自 -望远- 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yanquan345/artic ...

  6. Mac OS X下安装Python的MySQLdb模块【终结版】

    1.下载源文件: https://pypi.org/project/MySQL-python/ 2.cd 到源文件所在目录: 3.在目录下使用 python setup.py install 命令安装 ...

  7. Windows AD域管理软件

  8. socketserver模块实现并发和连接合法性验证

    一.socketserver模块 1.sockeserver的源码流程 2.简单的使用 socketserver服务端 import socketserver class MyServer(socke ...

  9. 网络编程之IO模型

    IO模型的分类 blocking IO:阻塞IO nonblocking IO:非阻塞IO IO multiplexing:IO多路复用 signal driven IO:异步IO 通常情况下IO默认 ...

  10. 常用API接口

    引用  常用API接口汇总