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

以下是最小费用流的实现,因为残余网络中存在负权边,所以使用bellman-ford算法求解最短路。

#include <vector>
#include <cmath>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;const int MAX_V = 1005;
const int INF = 0x3f3f3f3f;
struct Edge{int to,cap,cost,rev;Edge(int t,int c,int co,int r):to(t),cap(c),cost(co),rev(r) {}
};
vector<Edge> G[MAX_V];
int V;
int prevv[MAX_V],preve[MAX_V];
int dist[MAX_V];void add_edge(int from,int to,int cap,int cost){G[from].push_back( Edge(to,cap,cost,G[to].size()) );G[to].push_back( Edge(from,0,-cost,G[from].size()-1) );
}int min_cost_flow(int s,int t,int f){int res = 0;while(f>0){fill(dist,dist+V,INF);dist[s] = 0;bool update = true;while(update){for(int v=0; v<V; v++){if(dist[v] == INF) continue;for(int i=0; i<G[v].size(); i++){Edge &e = G[v][i];if(e.cap>0 && dist[e.to] > dist[v] + e.cost){dist[e.to] = dist[v] + e.cost;prevv[e.to] = v;preve[e.to] = i;update = true;}}}}if(dist[t] == INF){return -1;}int d = f;for(int v = t; v != s; v = prevv[v]){d = min( d , G[prevv[v]][preve[v]].cap);}f -= d;res += d * dist[t];for(int v = t; v != s; v = prevv[v]){Edge &e = G[prevv[v]][preve[v]];e.cap -= d;G[v][e.rev].cap += d;}}return res;
}int main()
{return 0;
}

最小费用流bellman-ford算法总结相关推荐

  1. bellman ford 算法 判断是否存在负环

    Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统        程序员11月书讯,评论得书啦        Get IT技能知识库,50个领域一键直达 关闭 bellman for ...

  2. Bellman——Ford算法

    Bellman--Ford 算法介绍 思路讲解 案例分析与代码实现 案例分析 代码实现 优先队列优化(SPFA) 优化原理 代码实现 算法介绍 我们知道Dijkstra算法只能用来解决正权图的单源最短 ...

  3. bellman - ford算法c++

    (最短路III)bellman - ford算法(适用于含负权边的图) 注意:用该算法求最短路,在有边数限制的情况下可以存在负权回路!且对所走的边的数量有要求时只能用该算法实现! 解析:因为如果没有边 ...

  4. Bellman Ford算法详解

    一.用途 1. Bellman Ford算法是解决拥有负权边最短路问题的方法之一.还有一种方法是SPFA算法. 2. 二者相比,SPFA算法在效率方面是优于Bellman Ford算法的.但在某些情况 ...

  5. Bellman ford算法(贝尔曼·福特算法)

    Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...

  6. 图解Bellman Ford算法

    Bellman Ford 单源最短路径算法[中字] Bellman Ford 单源最短路径算法[中字]_哔哩哔哩_bilibili 贝尔曼-福特算法(Bellman–Ford algorithm )油 ...

  7. LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)

    文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...

  8. bellman ford 算法

    Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求解最短 ...

  9. 单源最小路径BellMan Ford算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法. 输入:带权图 输出:从第0个点到其他点的最短路径值 B ...

  10. c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序

    匿名用户 1级 2010-06-01 回答 //这个是邻接表 typedef struct oo { int len,num; struct oo *next; } link; typedef str ...

最新文章

  1. 浅谈自考学习方法(二)
  2. python编码注释和平台注释_python注释是什么意思
  3. Flask 实战:如何从零开发“知乎”
  4. java sql server 存储过程_修改SQL SERVER内置存储过程
  5. 定制iOS 7中的导航栏和状态栏
  6. 为什么蚂蚁金服架构师建议从Zookeeper开始提升技术水平?
  7. Python 数据结构与算法——插入排序(insertion sort)
  8. 电脑连接Wifi,只能上QQ不能上网。关键字:无Internet访问权限。
  9. php mysql登陆页面完整代码_PHP实现用户登录的案例代码
  10. 汉字常用字unicode码表
  11. spark streaming读取kafka数据,记录offset
  12. php计算一年多少周,同时计算出这一周的开始时间和结束时间(可选返回时间戳或日期)
  13. java+上传整个文件夹的所有文件
  14. [JavaScript][AJAX] 前后端交互流程,ajax工作流程
  15. 13 分钟速览 WWDC22
  16. 计算机视觉-棋盘格标定
  17. v-show和v-if
  18. 【NOIP模拟】行走
  19. 马克扎克伯格节俭_马克·扎克伯格的垃圾实在很难抢
  20. 公钥 私钥 数字签名 CA证书

热门文章

  1. linux下怎么批量命名文件,linux下的文件操作——批量重命名
  2. python遍历文件夹下文件 批量重命名
  3. ios开发面试常见问题及答案
  4. Hyperic HQ简介
  5. 解决一直Gradle Build Running的问题
  6. 【论文精读】MVSTER
  7. visio2013 如何快速画出所有箭头
  8. 解决:win10下修改mac地址的方法
  9. 汕尾督办pc端和移动端
  10. 后端程序员看前端想死(二)进入页面之后js分析