前言

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

算法步骤

  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. sql2005性能优化(在32位系统上突破2G内存使用量的方法) .

    转载自http://blog.csdn.net/soldierluo/article/details/6589743 服务器磁盘为(SAS)IBM组成RAID0+1,SQL2K5只识别4G内存,实际只 ...

  2. Ubuntu下Tomcat绑定80端口(zz)

    Ubuntu下Tomcat绑定80端口 来源:本站转载 作者:佚名 时间:2011-02-22 TAG: 工作环境迁移到了Ubuntu,很多东西发生了变化,比如原先配置tomcat端口.只需要配置se ...

  3. linux_修改ip(重启后永久生效)

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet UUID=a20869f2-4095-4e5d-9b0c- ...

  4. JSON_FORCE_OBJECT 数字索引数组 强转对象

    $abc = array('a','b','c','d','e','f','g'); echo '<pre>'; var_dump($abc); echo json_encode($abc ...

  5. KAFKA 监控管理界面 KAFKA EAGLE 安装

    概述 Kafka Eagle监控系统是一款用来监控Kafka集群的工具,目前更新的版本是v1.2.3,支持管理多个Kafka集群.管理Kafka主题(包含查看.删除.创建等).消费者组合消费者实例监控 ...

  6. Java之spilt()函数,trim()函数

    一.单个符号作为分隔符  package com.regix; public class FuncSpilt { public static void main(String[] args) { // ...

  7. excel2007自定义菜单项学习

    参考: http://club.excelhome.net/thread-1288002-1-1.html http://club.excelhome.net/thread-709306-1-1.ht ...

  8. crontab和crond分析

    目录 目录 1 1. 研究目的 1 2. 基本概念 1 3. crontab 1 3.1. 编辑 2 3.1.1. "crontab -e"工作流 2 3.2. 问题 3 4. c ...

  9. winSockets编程(三)最简单的C/S形式

    功能:向服务器端发送一个字符串,属于最简易的形式,一共需要4个主要步骤,初始化-建立套接字-连接服务器-发送数据 /****************************************** ...

  10. Update Node.js Package.json

    Update the latest package while using node.js, follow the command as following. npm i -g npm-check-u ...