首页 > 其他分享 >最小费用最大流问题,MCMF模板

最小费用最大流问题,MCMF模板

时间:2023-08-03 20:23:52浏览次数:35  
标签:tmp MCMF int vi 最小 wi vis 模板 dis

// 最小费用最大流
struct MCMF
{
    struct node
    {
        int vi,id,wi,ci;
    };
    const int inf = 0x3f3f3f3f;
    int S,T,mxflow,cost;
    std::vector<int> dis,to,cur;
    std::vector<bool> vis;
    std::vector<std::vector<node>> r;
    MCMF(int n,int s,int t) : dis(n + 10),vis(n + 10),r(n + 10),cur(n + 10),S(s),T(t),mxflow(0),cost(0){}

    int spfa()//spfa代替bfs寻找增广路
    {
        std::fill(dis.begin(), dis.end(), inf);
        std::fill(vis.begin(), vis.end(), 0);
        queue<int> q;
        q.push(S);dis[S] = 0;
        while(q.size())
        {
            int x = q.front();q.pop();
            vis[x] = 0;//vis用于判断节点是否在队列中,若在,则最短路更新时不需重复加入队列
            for(auto tmp:r[x])
            {
                if(tmp.wi && dis[x] + tmp.ci < dis[tmp.vi])
                {
                    dis[tmp.vi] = dis[x] + tmp.ci;
                    if(!vis[tmp.vi])
                        q.push(tmp.vi),vis[tmp.vi] = 1;
                }
            }
        }
        if(dis[T] == inf)
            return 0;
        return 1;
    }

    int dfs(int x,int fl)
    {
        if(x == T)
            return fl;
        vis[x] = 1;//此处vis用于判断节点是否在目前选择的增广路上,若在,则不能重复加入。因为例题路径可能有0环存在
        int rem = fl;
        for(int i = 0;i < r[x].size();i ++)
        {
            if(rem == 0)
                break;
            int vi = r[x][i].vi,wi = r[x][i].wi,ci = r[x][i].ci;
            if(dis[x] + ci == dis[vi] && wi && !vis[vi])
            {
                int flow = dfs(vi,min(rem,wi));//找到可行流
                if(flow > 0)
                {
                    rem -= flow;
                    r[x][i].wi -= flow;
                    r[vi][r[x][i].id].wi += flow;
                    cost += ci*flow;//计算费用
                    if(rem <= 0)
                        break;
                }
                
            }
        }
        vis[x] = 0;//撤销点,看看能不能继续找到一条增广路
        if(fl == rem)
            dis[x] = inf;//如果从x点出发找不到可行流,则不再找x这个点
        return fl - rem;
    }

    void addEdge(int u,int v,int w,int c)//vector存图
    {
        r[u].push_back({v,(int)r[v].size(),w,c});
        r[v].push_back({u,(int)r[u].size() - 1,0,-c});
    }

    void Mxflow()//费用流
    {
        while(spfa())
        {
            for(auto &v:cur)
                v = 0;
            mxflow += dfs(S,inf);
        }
       //printf("%d %d\n",mxflow,cost);
    }

};

 

标签:tmp,MCMF,int,vi,最小,wi,vis,模板,dis
From: https://www.cnblogs.com/chayi/p/17604353.html

相关文章

  • 最大权匹配问题,KM模板
    classKM{public://MAXN最大点数oo无穷大staticconstintMAXN=405,oo=1000101010;intnl,nr,m;//左边的点数,右边的点数,边数intresult[MAXN];//左边点最大权匹配的匹配longlongans;KM(intnl,intnr,intm):nl(nl)......
  • 剑指 Offer 11. 旋转数组的最小数字(简单)
    题目:classSolution{public:intminArray(vector<int>&numbers){intresult=numbers[0];//当旋转0个元素时第一个元素就是最小值if(numbers.size()==1)returnresult;for(inti=1;i<numbers.size();i++){//通过观......
  • 微信公众号发模板消息(spring集成)
    引入依赖:<dependency><groupId>me.chanjar</groupId><artifactId>weixin-java-mp</artifactId><version>1.3.3</version></dependency> 其中已实现的功能:publicinter......
  • T4 模板: 为 ASP.NET MVC 开发人员快速入门指南
    http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx 在中提到我们的最近博客文章,ASP.NETMVC发布候选版,我们的代码生成功能(即,添加控制器和添加视图)现在使用T4(文本模板转换工具包)模板化技术在幕后。因为......
  • protoc-gen-doc 自定义模板规则详解
    protoc-gen-doc自定义模板规则详解配套演示工程此项目中所用proto文件位于./proto目录下,来源于官方proto示例此项目中所列所有模板case文件位于./tmpl目录下此教程均基于markdown文本演示前言最近有通过proto文件生成其接口文档的需求,而protoc-gen-doc所生成......
  • 【SpringBoot学习】1、SpringBoot 配置 jsp 模板引擎
    springboot整合jsp页面创建springboot项目就不废话了。在原来的基础上直接加东西就可以了1、添加jsp支持的jar包<!--servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provid......
  • Tita 升级|总结模板,满足多种管理要求
    升级详情一、【总结】支持自定义总结模板「总结模板」菜单1.都谁可见总结管理员、超管、老板、助理可见总结模板菜单,并可查看系统模板与公司的所有自定义模板;当你被授权为某个自定义菜单的管理员时,也可看到总结模板菜单与被授权管理的模板;注意:系统模板不可编辑,仅总结管......
  • 快读模板
    inline__int128read(){__int128x=0,f=1;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0�......
  • 模板的简单使用
    这篇博客主要是简单的介绍函数模板和类模板的使用。函数模板假设现在需要你写多个交换函数用于各种类型的交换,如果一个一个写的话那即浪费时间,也会让代码整体不好看。那么为了解决这种情况就可以使用函数模板。例如下面:usingnamespacestd;//模板函数template<classT>//如果你......
  • 二叉树的最小深度
    所以,如果左子树为空,右子树不为空,说明最小深度是1+右子树的深度。反之,右子树为空,左子树不为空,最小深度是1+左子树的深度。最后如果左右子树都不为空,返回左右子树深度最小值+1。1intminshendu(Node*node){2if(node==nullptr)return0;3if(node......