最小费用流

最小费用流bellman-ford算法总结 最小费用流问题是寻找流为F时的最小费用,普通的最大流中边只有流量限制,而在费用流中还加上了费用,为保证过程可逆和正确性残余网络中的负权边是原边费用的相反数,求解此类问题的方法依然是贪心,我们在残余网络上总是沿着最短路增广,这样可以保证在当前流量下,取得最小的费用(权值为费用),一直贪心下去,直到F减为0,这里有一个问题,F能否减到0呢,答案是肯定的,考虑最大流算法,我们总是能从0扩展到任意流(流不 阅读详情

单向图
题目链接请点这里

#include<cstdio>//每次找费用的最短路,更新残留网络图直到找不到最短路为止
#include<cstring>//最大费用  权值取负值  结果取负值
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
struct Node
{
    int u,v,w,cost,next;
}node[1001000];
int head[1001000],cont,sumflow;
int vis[101000],dist[101000];
int pre[101000];
void init()
{
    cont=0;
    sumflow=0;
    memset(head,-1,sizeof(head));
}
void add(int u,int v,int w,int cost)//建图
{
    int i;
    for(i=head[u]; i!=-1; i=node[i].next)//去重边
    {
        if(node[i].v==v)
        {
            if(node[i].cost>cost)//更新重边的费用
                node[i].cost=cost,node[i^1].cost=-cost;
            return ;
        }
    }
    node[cont].u=u,node[cont].v=v;
    node[cont].w=w,node[cont].cost=cost;
    node[cont].next=head[u],head[u]=cont++;
    node[cont].u=v,node[cont].v=u;
    node[cont].w=0,node[cont].cost=-cost;//反向边费用为负的
    node[cont].next=head[v],head[v]=cont++;
}

int SPFA(int st,int ed)//寻找最短路
{
    queue<int> q;
    //memset(vis,0,sizeof(vis));//数组太大容易超时
    //memset(pre,-1,sizeof(pre));
    for(int i=0; i<=ed; i++)
    {
        dist[i]=inf;
        vis[i]=0;
        pre[i]=-1;
    }
    dist[st]=0;
    vis[st]=1;
    q.push(st);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u]; i!=-1; i=node[i].next)
        {
            int v=node[i].v;
            if(node[i].w&&dist[v]>dist[u]+node[i].cost)
            {
                dist[v]=dist[u]+node[i].cost;
                pre[v]=i;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    if(dist[ed]==inf) return 0;//找不到最短路
    return 1;
}
int MCMF(int st,int ed)
{
    int mincost=0,flow=0;
    while(SPFA(st,ed))//有最短路 更新残留网络
    {
        int mins=inf;
        for(int i=pre[ed]; i!=-1; i=pre[node[i].u])//找到这条路径上的最小能更新的流量
            mins=min(mins,node[i].w);
        for(int i=pre[ed]; i!=-1; i=pre[node[i].u])//更新流量
        {
            node[i].w-=mins;
            node[i^1].w+=mins;
        }
        mincost+=dist[ed]*mins;//每次找到最短路后更新最小费用
        flow+=mins;//更新最大流
    }
    sumflow=flow;//最大流
    return mincost;
}
int main()
{
    int ncase;
    scanf("%d",&ncase);
    while(ncase--)
    {
        init();
        int n,m;
        scanf("%d%d",&n,&m);
        int st=0,ed=2*n+1;
        for(int i=1; i<=n; i++)
        {
            add(st,i,1,0);
            add(i+n,ed,1,0);
        }
        for(int i=0; i<m; i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b+n,1,c);
        }
        int ans=MCMF(st,ed);//最小费用最大流
        printf("%d\n",ans);
    }
    return 0;
}

双向图
题目链接

#include<cstdio>//每次找费用的最短路,更新残留网络图直到找不到最短路为止
#include<cstring>//最大费用  权值取负值  结果取负值
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
struct Node
{
    int u,v,w,cost,next;
}node[1001000];
int head[1001000],cont,sumflow;
int vis[101000],dist[101000];
int pre[101000];
void init()
{
    cont=0;
    sumflow=0;
    memset(head,-1,sizeof(head));
}
void add(int u,int v,int w,int cost)//建图
{
    int i;
    for(i=head[u]; i!=-1; i=node[i].next)//去重边
    {
        if(node[i].v==v)
        {
            if(node[i].cost>cost)//更新重边的费用,有时是双向边
            {
                //cost,-cost;//第二条边
                node[i^2].cost=node[i].cost=cost,node[(i^1)^2].cost=node[i^1].cost=-cost;//第一条边
            }
            return ;
        }
    }
    node[cont].u=u,node[cont].v=v;
    node[cont].w=w,node[cont].cost=cost;
    node[cont].next=head[u],head[u]=cont++;
    node[cont].u=v,node[cont].v=u;
    node[cont].w=0,node[cont].cost=-cost;//反向边费用为负的
    node[cont].next=head[v],head[v]=cont++;
}

int SPFA(int st,int ed)//寻找最短路
{
    queue<int> q;
    //memset(vis,0,sizeof(vis));//数组太大容易超时
    //memset(pre,-1,sizeof(pre));
    for(int i=0; i<=ed; i++)
    {
        dist[i]=inf;
        vis[i]=0;
        pre[i]=-1;
    }
    dist[st]=0;
    vis[st]=1;
    q.push(st);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u]; i!=-1; i=node[i].next)
        {
            int v=node[i].v;
            if(node[i].w&&dist[v]>dist[u]+node[i].cost)
            {
                dist[v]=dist[u]+node[i].cost;
                pre[v]=i;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    if(dist[ed]==inf) return 0;//找不到最短路
    return 1;
}
int MCMF(int st,int ed)
{
    int mincost=0,flow=0;
    while(SPFA(st,ed))//有最短路 更新残留网络
    {
        int mins=inf;
        for(int i=pre[ed]; i!=-1; i=pre[node[i].u])//找到这条路径上的最小能更新的流量
            mins=min(mins,node[i].w);
        for(int i=pre[ed]; i!=-1; i=pre[node[i].u])//更新流量
        {
            node[i].w-=mins;
            node[i^1].w+=mins;
        }
        mincost+=dist[ed]*mins;//每次找到最短路后更新最小费用
        flow+=mins;//更新最大流
    }
    sumflow=flow;//最大流
    return mincost;
}
int main()
{
    int ncase,Z=0;
    scanf("%d",&ncase);
    while(ncase--)
    {
        init();
        int n,m;
        scanf("%d%d",&n,&m);
        int st=0,ed=2*n+1;
        for(int i=1; i<=n; i++)
        {
            add(st,i,1,0);
            add(i+n,ed,1,0);
        }
        for(int i=0; i<m; i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);//双向边
            add(a,b+n,1,c);
            add(b,a+n,1,c);
        }
        int ans=MCMF(st,ed);//最小费用最大流
        printf("Case %d: ",++Z);
        if(sumflow!=n)
        printf("NO\n");
        else
        printf("%d\n",ans);
    }
    return 0;
}
最小费用流总结(SPFA 和dijstra两种算法实现) 最小费用流 大致思路: ​ 在寻找增广路的前提下,只找s到t距离最短的增广路,并沿着这条路进行增广。 本代码采用SPFA进行寻找最短的增广路,如果所有costcostcost为正的,则保证残余流量图中不会出现负环。 为什么不会出现负环? 如果出现负环,代表这个环有流量,且环中的边都是反向边(costcostcost为负的)。且在此之前肯定沿着环的反方向进行增广了(当时肯定是正环) ,但是如果先... 阅读详情

相关推荐

POJ2175-最小费用流消圈算法

#include #include #include #include #include using namespace std; const int NN=210; const int MM=100000; const int INF=0x3fffffff; inline int Abs(int x) { if (x>=0) return x; else

Wo xi Meiz 2916

最小费用流及其求法

【1】图与网络模型及方法:图与网络的基本概念 【2】图&网络模型应用—最短路径问题 【3】树:基本概念与最小生成树 【4】匹配问题: 匈牙利算法 、最优指派、相等子图 【5】Euler 图和 Hamilton 图 【6】计划评审方法和关键路线法【统筹方法】:广泛地用于系统分析和项 目管理 【7】最小费用流及其求法 : 【8】最大流问题 【10】钢管订购和运输问题 目录...

冷月无声的博客 3万+

利用Edmonds-Karp算法解决最小费用流问题

l  利用Bellman-Ford算法解决带有负权值有向图的最短路径问题。 l  利用Edmonds-Karp算法解决最小费用流问题(包括最小费用最大流问题)。 算法介绍: java代码实现: package sy4; import java.util.Scanner; import sy3.*; public class BellmanFord { public

yyywww666的专栏 960

最小费用流 用SPFA实现

/* (1)找到一条从源点到达汇点的“距离最短”的路径,“距离”使用该路径上的边的单位费用之和来衡量。 (2)然后找出这条路径上的边的容量的最小值f,则当前最大流max_flow扩充f,同时当前最小费用min_cost扩充 f*min_dist(s,t)。 (3)将这条路径上的每条正向边的容量都减少f,每条反向边的容量都增加f。 (4)重复(1)--(3)直到无法找到从源点到达汇点的路径。...

skykone1的博客 443

ks-快手滑块验证码-Js逆向

本文分析了快手滑块验证码的破解过程。首先通过抓包找到验证码背景图接口,发现需要动态获取captchaSession参数。然后深入分析验证流程,发现verifyParam参数被加密处理,需要追踪其生成逻辑。文章详细解析了加密参数c的构成,包括captchaSn、滑动距离、轨迹信息等,并指出轨迹验证较为严格。最后通过对比浏览器和本地生成的加密值,确认加密逻辑正确,但指出轨迹生成仍需优化。作者建议参考相关文章深入分析轨迹逻辑,并提供了验证成功的截图作为参考。

2302_76420666的博客 1875

Unity URP半透明物体深度排序优化:解决自交叠渲染瑕疵

本文深入探讨了Unity URP管线中半透明物体深度排序的优化方法,重点解决自交叠区域的渲染瑕疵问题。通过双通道渲染、深度预写入、多通道渲染等核心技术,结合实战案例和性能数据,帮助开发者实现高质量的透明效果渲染。

weixin_30879169的博客 418

有上下限的最小费用可行流

例题 BZOJ 3876 题意,有N个点,并且有一些边,每个点必须要经过一次,但是不限经过次数,也就是有下界的情况,且下界为1,现在每次的起点都是1,问至少花费的代价,使得每次从1开始,终点不限的情况下,走完所有的边(这里所谓的支线指的是每条边,点都被称之为剧情点)。 于是,很好发现是在说明一个有下限、无上限的最小费用可行流的这么一个问题了。 最小费用可行流的模型 给定一个网络,一...

既然弱小,就只顾变强就是了 1741

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1595

最小费用流和最大流的关系

最小费用流和最大流的关系

2301_80277867的博客 1185

电磁场可视化

电磁场可视化 如题,做了电磁场可视化这么久了,也是颇有些心得了,简单描述一下怎么做这个项目的。 开始时是从最基本的OpenGL开始做的,必不可少的翻了许多的文献,后来是直接在unity中做,发现效果挺好,而且可控性强好多。反复琢磨后,发现可视化的渲染,有几种思路,第一就是用linerender,画线的方法,另一种就是用shader。 第一种我通过unity自带的linewave插件可以做到 详细的就是,linewave插件可以轻松画出曲线等,并且可以添加碰撞,控制频率幅度长度等一切的条件数值,而且令人惊喜

weixin_43979140的博客 1670

控制科学与工程(自动化)保研经验【2】——南开、同济篇

禁止转载 1、南开人工智能学院夏令营   保研之旅第一个夏令营就是南开,南开夏令营非常早(6月份),当时我们专业仅有两人入营。夏令营前一天我们两个坐高铁来到了天津,几经辗转来到了南开的津南校区,非常偏僻。在自己找的酒店住了一晚,第二天一早去学院报到,资格审查、报销路费等等,然后开营仪式,吃饭,入住酒店,实验室参观。   开营仪式和实验室参观了解到,南开人工智能学院是国内第一批人工智能学院,和很多高...

Control Everything 6532

基于Floyd算法的最小费用流的负回路算法(图解)

屈婉玲《算法设计与分析》第2版第7章网络流算法学习笔记。 概述 最小费用流问题,可视为一般化的最短路径问题和最大流问题,即只要选定合适的权重、容量、流量,解决最小费用流的方法就能用来解决上述问题。另一方面,也意味着解最小费用流问题至少和解最短路径或最大流问题一样难。 显然可以用来解决物流运输最小成本问题,除此之外还有广泛应用,比如劳动力分配问题: 劳动力和任务间用边连接,费用为工人对任务的讨厌程度...

zhang35的博客 4121

MOS管基础知识及应用电路Multisim仿真

本文系统介绍了MOS管的基础知识及其在电子电路中的典型应用。首先详细解析了MOS管的基本结构、分类和工作原理,包括NMOS、PMOS及CMOS的特性差异。重点阐述了MOS管的三种放大组态电路(共源、共漏、共栅)及其小信号模型分析。随后通过Multisim仿真验证了MOS管在防反接电路、开关电路、放大电路、逻辑门电路、电平转换电路和开关电源(BUCK、BOOST、BUCK-BOOST)等应用中的实际表现。文章还深入探讨了自给偏压和分压式偏置电路的设计要点。全文通过理论分析与仿真实验相结合的方式,全面展示了MO

XU157303764的博客 1482

【图论】网络流——最大流和最小费用流

网络流

weixin_62313535的博客 6830

Unreal5从入门到精通之如何录制360°VR全景视频

摘要:本文详细介绍了使用虚幻引擎(UE)生成360°全景视频的完整流程。首先需启用MovieRender Queue和Panoramic Capture插件,准备场景并设置相机序列。通过影片渲染队列选择8K分辨率输出PNG序列帧,利用ffmpeg工具转换为MP4格式,最终获得高精度全景视频。该方法适用于VR内容开发,能以较低性能消耗实现影院级画质,特别适合冥想类应用场景。教程涵盖从插件配置到后期合成的全链路操作,为开发者提供高效的全景内容生产解决方案。(150字)

TxNet 1401

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

努力,加油每一天鸭~ 824

网络最大流和最小费用流

这段时间复习了下网络流模型,感觉比以前的理解有了长足进展,虽然我知道这东西难就难在建模上,而它的算法本身其实难度不大,但我还是决定说一些我的理解,毕竟理解了本质的东西运用起来才会更灵活。最大流的求解一般有两类算法(用费用流附带求出的不列入考虑范围),就是增广路(FF)系列和预流推进(PF)系列。在很多地方都看到推荐使用后者,因为效率更高,但其实不然,今天我这篇文章就是要重点介绍前者,相信大家看

low coder 2475

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

从入门到精通: 最小费用流的“zkw算法”

点击打开链接 1. 网络流的一些基本概念 点击阅读   很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本的概念反而说不清楚. 虽然不同的模型在具体叫法上可能不相同, 但是不同叫法对应的思想是一致的. 下面的讨论力求规范, 个别地方可能需要对通常的叫法加以澄清.   求解可行流: 给定一个网络流图, 初始时每个节点不一定平衡 (每个节点可以有盈余或不足), 每

Mr.Phoebe的专栏 8126

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

D - Farm Tour(最小费用流)

D - Farm Tour(最小费用流) POJ - 2135 思路: ​ 问题可以转化为求两条111到nnn的路径,使得这两条路径没有重边且费用和最小。而这个问题我们又可以转化为最小费用流问题。对于uuu到vvv的费用为www双向边,在图中转化为uuu到vvv容量111费用为www的边和vvv到uuu容量为111,费用为www的边; 求111到nnn流量为2​2​2​的最小费用即可。 由网络...

Dch19990825的博客 293

使用循环抵消算法求解最小费用流问题

道路系统、水管网络或数据网络是催生"流问题"这类优化问题的实际背景。这类系统的共同特征在于:某种资源需要通过图的边进行传输,而每条边都有流量承载上限的约束。在某些情况下,边还具有其他属性,因此需要为特定边的使用分配成本——例如高速公路网中可变的通行费。在这种背景下,如何以最低成本将特定流量通过网络输送就成为一个值得研究的问题。该问题被称为"最小费用流问题"。

博客简介 1415

20200607 练习:最小费用可行流

T1 P4043 [AHOI2014/JSOI2014]支线剧情 思路: 每条边下限为 1,上限为 INF 将每个点连一条到 1 号节点,流量 INF,费用 0的边 跑上下界网络流即可 最小费用可行流: 考虑一张网络流图,每条边定义为 (u,v,l,r,c)(u,v,l,r,c)(u,v,l,r,c),代表从 uuu 到 vvv 的一条有向边,费用为 ccc,容量为 [l,r][l,r][l,r] 闭区间,已知源点 sss 汇点 ttt,且保证源点没有入边、汇点没有出边 同时定义常规费用流图的边为 (u,v

hongkongreporter 315

最小费用流问题(部分)

网络流之最小费用流问题(不完善)

Luckfort 1268

运输问题(最小费用流)

Description     W公司有m个仓库和n 个零售商店。第i 个仓库有ai 个单位的货物;第j 个零售商店需要bj个单位的货物。货物供需平衡,即 。从第i 个仓库运送每单位货物到第j 个零售商店的费用为Cij 。试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。     对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案。

martinue 7160

【POJ2516】【最小费用流】

Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 15057   Accepted: 5176 Description Dearboy, a goods victualer, now comes to a big problem, and

ACM之路 345
上一篇: 带权二分图匹配KM算法
下一篇: 最小费用最大流(拆边)
acmer_zp
博客等级 码龄11年 18粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值