首页 > 编程语言 >最大流 dinic算法

最大流 dinic算法

时间:2024-10-10 16:43:47浏览次数:6  
标签:nxt 最大 int res flow dep 算法 dinic include

洛谷 P3376

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <numeric>
#include <functional>
#include <set>
#include <cmath>
#include <random>
#include <chrono>
#include <iomanip>

//#define NDEBUG
//#include <cassert>

#define DEBUG(x) cout<<(x)<<endl;
#define DEBUGA(l,r,a) for (int i=l;i<=r;++i) cout<<a[i]<<' ';cout<<endl;
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
const int maxn=2e5+7;
const int inf=(1u<<31)-1;
const int mod=998244353;
// mt19937_64 rnd_64(chrono::system_clock::now().time_since_epoch().count());

inline int read(){
    int x=0,w=0;char ch=0;
    while (ch<'0'||ch>'9') {w|=ch=='-';ch=getchar();}
    while (ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return w?-x:x;
}

inline void write(int x){
    if (x<0) putchar('-'),x=-x;
    if (x>9) write(x/10);
    putchar(x%10+'0');
}

struct MF{
    //dinic

    struct edge{
        int v, nxt, cap, flow;
        edge(){}
        edge(int v, int nxt, int cap, int flow): v(v), nxt(nxt), cap(cap), flow(flow) {}
    };
    vector<edge> e;
    int cnt;
    vector<int> head, cur;

    int n, m, S, T;
    ll maxflow;
    vector<int> dep;

    MF(int _n,int _m,int _S,int _T): n(_n), m(_m), S(_S), T(_T){
        head.assign(n+1, -1);
        cnt=maxflow=0;
        e.assign(m<<1, edge());
    }

    void addedge(int u, int v, int w){
        e[cnt] = {v, head[u], w, 0};
        head[u] = cnt++;
        e[cnt] = {u, head[v], 0, 0};
        head[v] = cnt++;
    }

    bool bfs(){
        queue<int> q;
        dep.assign(n+1, 0);
        dep[S] = 1;
        q.push(S);
        while (!q.empty()){
            int u = q.front(); q.pop();
            for (int i = head[u]; ~i; i = e[i].nxt){
                int v = e[i].v;
                if (!dep[v] && e[i].cap>e[i].flow){
                    dep[v] = dep[u]+1;
                    q.push(v);
                }
            }
        }
        return dep[T];
    }

    int dfs(int u, int flow){
        if (u==T || !flow) return flow;
        int res = 0;
        for (int& i = cur[u]; ~i; i = e[i].nxt){
            int v = e[i].v;
            int d;
            if (dep[v]==dep[u]+1 && (d=dfs(v, min(flow-res, e[i].cap-e[i].flow)))){
                res += d;
                e[i].flow += d;
                e[i^1].flow -= d;
                if (res==flow) return res;
            }
        }
        return res;
    }


    void dinic(){
        while (bfs()){
            cur.assign(head.begin(), head.end());
            maxflow += dfs(S, inf);
        }
    }
};

void solve(){
    int n,m,S,T;
    cin>>n>>m>>S>>T;
    MF mf(n,m,S,T);
    for (int i=1;i<=m;++i){
        int u,v,w;
        cin>>u>>v>>w;
        mf.addedge(u,v,w);
    }
    mf.dinic();
    cout<<mf.maxflow<<endl;
}


int main(int argc,char* argv[]){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T=1;
//    cin>>T;
    while (T--) solve();

    return 0;
}

标签:nxt,最大,int,res,flow,dep,算法,dinic,include
From: https://www.cnblogs.com/qsbqsbqym/p/18456695

相关文章

  • 银行家算法小笔记
    最著名的避免死锁算法:将操作系统视为银行家,操作系统管理的资源视为银行家管理的资金。数据结构的描述假设n个进程,m类资源,银行家需要定义下面4个数据结构:可利用资源向量最大需求矩阵分配矩阵需求矩阵描述:设Requests_i是进程P-i的请求向量,Request_i[j]=K表示进程P-i需......
  • Alder32校验算法
    c源码/*adler32.c--computetheAdler-32checksumofadatastream*Copyright(C)1995-2004MarkAdler*Forconditionsofdistributionanduse,seecopyrightnoticeinzlib.h*//*@(#)$Id$*/#defineZLIB_INTERNAL#include"zlib.h"#defineBAS......
  • 基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印)   2.算法运行软件版本matlab2017b 3.部分核心程序(完整版代码包含中文注释和操作步骤视频)function[Ic,Xmin3,Xmax3,Ymin3,Ymax3]=func_merge(I,Trafficxy,Smj,SCALE);%提取交通标志的中心点,判断是否为同一......
  • STL——2.算法
    一、遍历1.for_eachvoidMyPrint(intval){cout<<val<<endl;}vector<int>v1={1,2,3,4};for_each(v1.begin(),v1.end(),MyPrint);2.transformv2.resize(v1.size());//先开辟空间,否则报错transform(v1,begin(),v1.end(),v2.begin(),MyPri......
  • K近邻算法
    一、K近邻算法基础介绍K近邻算法也是常说的KNN算法,是一种常见的分类和回归算法,当然我们常将其用于分类。是一种监督算法,该算法的内容其实和名字很像,根据邻居来进行判断。有点近朱者赤近墨者黑的意味。比如我们常说:某个人的工资一般是与其玩的最好的5个朋友(或者说是N个)工资......
  • kmp算法模板
    voidkmp(){n=strlen(s+1);//s是目标串m=strlen(p+1);//p是模板串//nxt预处理开始intj=0;nxt[1]=0;for(inti=2;i<=m;i++){while(j>0&&p[j+1]!=p[i])/*判断当前子串的前后缀相等的长度是否能增......
  • 从理论到实践:AI智能分析网关V4烟火检测算法的应用场景探索
    在信息化和智能化的今天,AI智能分析网关V4作为一款集成了先进技术的硬件设备,在烟火检测领域展现出了强大的应用价值。本文将详细阐述AI智能分析网关V4烟火检测算法的原理及其在各种场景中的应用。一、AI智能分析网关V4烟火检测算法原理深度学习基础TSINGSEE青犀AI智能分析网关V4......
  • 数据结构与算法2
    目录栈和队列1.栈(stack)1.1栈的定义和特点1.2顺序栈的表示1.3顺序栈的实现1.3.1顺序栈的初始化1.3.2顺序栈判断栈是否为空1.3.3求顺序栈长度1.3.4清空顺序栈1.3.5销毁顺序栈1.3.6顺序栈的入栈1.3.7顺序栈的出栈1.4栈链的表示1.5栈链的实现1.5.1栈链的初始化1.5.2判断......
  • 5.3 C#数组的基本操作与排序(数组赋值、最大最小值、冒泡排序、选择排序、Array类排序)
    文章目录5.3.1C#数组对象的赋值例5-5:通过循环给一维数组赋值例5-6:通过键盘输入给数组赋值5.3.2C#数组对象的输出例5-7:不同类型数组的输出5.3.3C#求数组中的最大(小)元素值例5-8:求数组中的最大值和最小值5.3.4C#数组排序1.使用Array类排序(例5-9)2.冒泡排序(例5-......
  • 算法笔记(十五)——BFS 解决拓扑排序
    文章目录拓扑排序课程表课程表II火星词典拓扑排序有向无环图(DAG图)有向无环图指的是一个无回路的有向图AOV网:顶点活动图在有向无环图中,用顶点表示一个活动,用边来表示活动的先后顺序的图结构拓扑排序找到一个先后顺序,结果可能不唯一如何拓扑排序?找到一......