首页 > 编程语言 >DINIC算法模板

DINIC算法模板

时间:2023-07-27 17:34:22浏览次数:29  
标签:tmp int vi wi 算法 res DINIC 模板 rk

//定义一个名为F的网络流:NetWorkFlow F(n,S,T);
//复杂度V^2*E
struct NetWorkFlow
{
    struct Flownode
    {
        int vi,id;
        int wi;
    };
    int S,T;
    const int inf = 0x3f3f3f3f;
    std::vector<int> rk,cur;
    std::vector<std::vector<Flownode>> r;
    NetWorkFlow(int n,int s,int t) : r(n + 1),rk(n + 1,0),cur(n + 1),S(s),T(t){}

    int bfs()
    {
        std::fill(rk.begin(), rk.end(), 0);
        //memset(&rk[0],0,rk.size() * sizeof rk[0]);
        queue<int> q;
        q.push(S);
        rk[S] = 1;
        while(q.size())
        {
            int x = q.front();q.pop();
            for(auto tmp:r[x])
            {
                if(!rk[tmp.vi] && tmp.wi)
                {
                    rk[tmp.vi] = rk[x] + 1;
                    q.push(tmp.vi);
                }
            }
        }
        return rk[T];
    }

    int dfs(int x,int fl)
    {
        if(x == T) return fl;
        int res = fl;
        for(int &i = cur[x];i < r[x].size();i ++)
        {
            Flownode tmp = r[x][i];
            if(rk[tmp.vi] == rk[x] + 1 && tmp.wi)
            {
                int flow = dfs(tmp.vi,min(tmp.wi,res));
                r[x][i].wi -= flow;
                r[tmp.vi][r[x][i].id].wi += flow;
                res -= flow;
                if(res <= 0)
                    break;
            }
        }
        if(fl == res) rk[x] = 0;
        return fl - res;
    }

    void addEdge(int u,int v,int val)
    {
        r[u].push_back({v,(int)r[v].size(),val});
        r[v].push_back({u,(int)r[u].size() - 1,0});
    }

    int Mxflow()
    {
        int ans = 0;
        while(bfs())
        {
            for(auto &v:cur)
                v = 0;
            ans += dfs(S,inf);
        }
        return ans;
    }
    
};

 

标签:tmp,int,vi,wi,算法,res,DINIC,模板,rk
From: https://www.cnblogs.com/chayi/p/17585578.html

相关文章

  • 图片识别算法
    #多类->线性回归frommxnetimportgluonfrommxnetimportndarrayasndimportmatplotlib.pyplotaspltdeftransform(data,label):returndata.astype('float32')/255,label.astype('float32')mnist_train=gluon.data.vision.Fash......
  • P8436 【模板】边双连通分量 详细讲解
    P8436【模板】边双连通分量概念注意!双连通仅针对无向图而言。割边(桥):删去这条边使图不连通的边。边双连通图:不存在割边的图(等价定义:图中任意两个点都至少两条不同路径可以到达的图)。性质:一个点不可能同时属于2个边双连通图,因为如果两个双连通分量相交与一点,那么删去任......
  • 页面测试模板
    一级标题二级标题三级标题四级标题我是正文。woshizhengwen.代码块Javapackagecom.standard.controller;importjava.util.LinkedList;importjava.util.Queue;publicclassTest{publicstaticvoidmain(String[]args){QueueiQueue=newLi......
  • 论文解读|Struck算法:基于结构化输出预测的自适应视觉目标跟踪框架
    原创|文BFT机器人01背景本文的背景是关于自适应视觉目标跟踪的研究。在传统的跟踪方法中,通常采用基于检测的方式,即尝试学习一个分类器来区分目标对象和其周围的背景。然而,这种方法存在一些问题,例如需要手动选择特征和参数,容易受到噪声和目标变化的影响。为了解决这些问题,本文提......
  • Java十大经典排序算法汇总
    以下是十大经典排序算法:冒泡排序(BubbleSort):比较相邻两个元素,如果逆序则交换,重复多轮,直到无逆序情况。选择排序(SelectionSort):在待排序元素中选择最小(大)元素,放在已排序序列的起始位置,重复多轮,直到所有元素有序。插入排序(InsertionSort):从第二个元素开始,将每个元素插入到已排序......
  • 基础算法思想与搜索枚举
    位运算常用运算符按位与&按位或|按位异或^取反~左移<<右移>>非负整数原码反码补码都一样!运算符优先级不清楚就打括号!C++运算符优先级应用场景用二进制位表示元素的存在情况题目要求进行位运算获取二进制的某一位intgetBit(inta,intb){return(......
  • OI 模板合集
    此处存放本蒟蒻写过的各种cpp模板,不喜勿喷~#目录-基本算法-前缀和-差分-二分答案-基本数据结构-栈-队列-搜索-图上深度优先遍历-图上广度优先遍历#基本算法##前缀和```cppfor(inti=1;i<=n;i++){cin>>arr[i];......
  • 最短路模板总结
    最短路单源最短路所有边权都是正数朴素版Dijkstra算法(适用于稠密图)堆优化版Dijkstra算法(适用于稀疏图)存在负权边Bellman_Ford算法,用于仅存在负权边,并且对边数有限制Spfa算法对Bellman_Ford算法进行优化(容易被卡死)多源汇最短路可能不止一个起点,有很多询问,求任意......
  • 纪念我的算法竞赛生涯
    纪念我的算法竞赛生涯三年时间,白驹过隙。三年前一眼望不到尽头的竞赛之路,现在竟然也渐渐看到了尾声。按理说,以我这种并算不上勤奋的性格,通常应该懒得写这种文章来纪念些什么。(实际上这篇文章已经成功地被我从4月份拖到了现在)。不过思来想去,尽管常常自诩能记住很久之前的事,但是......
  • C++中的模板
    1.概念模板是对类型的抽象,为了更好的实现多态的思想。模板分为类模板和函数模板。2.函数模板就是在函数之前声明一下模板,然后执行的时候,函数自行判断推导类型。intadd(inta,intb){returna+b;}doubleadd(doublea,doubleb){returna+b;}//如a......