网络流想必大家都知道,在这不过多赘述。网络流中有一类问题是让你求最大流,关于这个问题,许多计算机学家给出了许多不同的算法,在这里——正如标题所说——我们只介绍其中的一种——\(\tt{Dinic}\)

Dinic是最大流算法中综合性能比较好的一个算法,它的思想继承\(Ford-Fulkerson\)算法,但对FF算法有了很大的一个改进。Dinic通过分层图大大提高了算法效率,减少了许多不必要的搜索。

例题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct zzz{
    int t,len,nex;
}e[100010<<2]; int head[10010],tot=1;
void add(int x,int y,int z){
    e[++tot].t=y;
    e[tot].len=z;
    e[tot].nex=head[x];
    head[x]=tot;
}
int vis[10010],s,t;
//每次搜索前跑一遍分层图
bool bfs(){
    queue <int> q;
    memset(vis,0,sizeof(vis));
    q.push(s); vis[s]=1;
    while(!q.empty()){
        int k=q.front(); q.pop();
        for(int i=head[k];i;i=e[i].nex){
            int to=e[i].t;
            if(!vis[to]&&e[i].len){
                q.push(to);
                vis[to]=vis[k]+1;
                if(to==t) return 1;
            }
        }
    }
    return vis[t];
}
//寻找增广路径
int dfs(int from,int flow){
    if(from==t||!flow) return flow;
    int rest=0,fl;
    for(int i=head[from];i;i=e[i].nex){
        int to=e[i].t;
        if(vis[to]==vis[from]+1&&(fl=dfs(to,min(flow-rest,e[i].len)))){
            e[i].len-=fl;
            e[i^1].len+=fl;
            rest+=fl;
            if(rest==flow) return flow;
        }
    }
    if(rest<flow)
      vis[from]=0;
    return rest;
}
//dinic
int dinic(){
    int ans=0;
    while(bfs())
      ans+=dfs(s,0x7ffffff);
    return ans;
}
inline int read()
{
    int k=0; char c=getchar();
    for(;c<'0'||c>'9';) c=getchar();
    for(;c>='0'&&c<='9';c=getchar())
      k=(k<<3)+(k<<1)+c-48;
    return k;
}
int main(){
    int n=read(),m=read();
    s=read(),t=read();
    for(int i=1;i<=m;i++){
        int x=read(),y=read(),z=read();
        add(x,y,z); add(y,x,0);
    }
    printf("%d",dinic());
    return 0;
}

网络流的$\mathfrak{Dinic}$算法的更多相关文章

  1. 网络流-最大流问题 ISAP 算法解释(转自Renfei Song's Blog)

    网络流-最大流问题 ISAP 算法解释 August 7, 2013 / 编程指南 ISAP 是图论求最大流的算法之一,它很好的平衡了运行时间和程序复杂度之间的关系,因此非常常用. 约定 我们使用邻接 ...

  2. HDU3549 Flow Problem(网络流增广路算法)

    题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...

  3. POJ 2455 网络流 基础题 二分+网络流 dicnic 以及 sap算法

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8189   Accepted: ...

  4. 网络流入门--最大流算法Dicnic 算法

    感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图一张.  ...

  5. 网络流之最大流算法(EK算法和Dinc算法)

    最大流 网络流的定义: 在一个网络(有流量)中有两个特殊的点,一个是网络的源点(s),流量只出不进,一个是网络的汇点(t),流量只进不出. 最大流:就是求s-->t的最大流量 假设 u,v 两个 ...

  6. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

  7. 网络流(2)——用Ford-Fullkerson算法寻找最大流

    寻找最大流 在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网,这正好可以用最大流模型解决.如何寻找一个复杂网络上的最大流呢? 直觉上的方案 一种直 ...

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

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

  9. 初探网络流:dinic/EK算法学习笔记

    前记 这些是初一暑假的事: "都快初二了,连网络流都不会,你好菜啊!!!" from 某机房大佬 to 蒟蒻我. flag:--NOIP后要学网络流 咕咕咕------------ ...

随机推荐

  1. 无法打开编译器生成的文件:“../../build/vs71/release/v100/MD_MBCS\json_value.

    1>正在生成代码 1>e:\Source\VC\?\json\jsoncpp-src-0.6.0-rc2\src\lib_json\json_value.cpp : fatal error ...

  2. 三星Gear VR与Oculus Rift DK2全方位比拼

    网易数码1月6日消息,Oculus Rift DK2并不是面向消费者的产品,而三星Gear VR则进入了大众市场.虽然二者有点不同,但还是值得对比一番,看看Gear VR相比当下虚拟现实领域佼佼者Oc ...

  3. 计算机网络自顶向下方法第3章-传输层 (Transport Layer).1

    3.1 概述和运输层服务 运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能. 3.1.1 运输层和网络层的关系 网络层提供了主机之间的逻辑通信,而 ...

  4. nil 与 release

    nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系:而release才是真正通知内存释放这个对象. 如果没有release就直接nil,那么虽然不会出错,却等于自己制造内存泄漏了,因为 ...

  5. Python 实现简单的登录注册界面

    Python 实现简单的登录注册界面 注意:编写代码之前需要导入很重要的包 import tkinter as tk import pickle from tkinter import message ...

  6. npm,cnpm,nrm区别

    npm npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) nrm nrm只是单纯的提供了几个常用的下载包的uri地址,并能 ...

  7. JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常

    在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...

  8. DRF教程1-序列化

    序列化类 要建立web API,要做的第一件事就是对实例进行序列化,比如以json方式显示.我们可以生命序列化,它和django的forms很相似.在app目录下创建serializers.py fr ...

  9. NOIP前计划

    距离NOIp还有13天 距离继续学/退役还有13天 是时候列一波计划了 1. 要学的东西 cdq分治(突然发现cdq分治不太行,而且说不定可以用来代替想不出来的数据结构题) 主席树(写的太少啦,不熟练 ...

  10. SNMP消息传输机制

    1.引言 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的所有可被查询和修改的参数.RF ...