最小费用流bellman-ford算法总结
最小费用流问题是寻找流为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算法总结相关推荐
- bellman ford 算法 判断是否存在负环
Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达 关闭 bellman for ...
- Bellman——Ford算法
Bellman--Ford 算法介绍 思路讲解 案例分析与代码实现 案例分析 代码实现 优先队列优化(SPFA) 优化原理 代码实现 算法介绍 我们知道Dijkstra算法只能用来解决正权图的单源最短 ...
- bellman - ford算法c++
(最短路III)bellman - ford算法(适用于含负权边的图) 注意:用该算法求最短路,在有边数限制的情况下可以存在负权回路!且对所走的边的数量有要求时只能用该算法实现! 解析:因为如果没有边 ...
- Bellman Ford算法详解
一.用途 1. Bellman Ford算法是解决拥有负权边最短路问题的方法之一.还有一种方法是SPFA算法. 2. 二者相比,SPFA算法在效率方面是优于Bellman Ford算法的.但在某些情况 ...
- Bellman ford算法(贝尔曼·福特算法)
Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...
- 图解Bellman Ford算法
Bellman Ford 单源最短路径算法[中字] Bellman Ford 单源最短路径算法[中字]_哔哩哔哩_bilibili 贝尔曼-福特算法(Bellman–Ford algorithm )油 ...
- LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)
文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...
- bellman ford 算法
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求解最短 ...
- 单源最小路径BellMan Ford算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法. 输入:带权图 输出:从第0个点到其他点的最短路径值 B ...
- c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序
匿名用户 1级 2010-06-01 回答 //这个是邻接表 typedef struct oo { int len,num; struct oo *next; } link; typedef str ...
最新文章
- 浅谈自考学习方法(二)
- python编码注释和平台注释_python注释是什么意思
- Flask 实战:如何从零开发“知乎”
- java sql server 存储过程_修改SQL SERVER内置存储过程
- 定制iOS 7中的导航栏和状态栏
- 为什么蚂蚁金服架构师建议从Zookeeper开始提升技术水平?
- Python 数据结构与算法——插入排序(insertion sort)
- 电脑连接Wifi,只能上QQ不能上网。关键字:无Internet访问权限。
- php mysql登陆页面完整代码_PHP实现用户登录的案例代码
- 汉字常用字unicode码表
- spark streaming读取kafka数据,记录offset
- php计算一年多少周,同时计算出这一周的开始时间和结束时间(可选返回时间戳或日期)
- java+上传整个文件夹的所有文件
- [JavaScript][AJAX] 前后端交互流程,ajax工作流程
- 13 分钟速览 WWDC22
- 计算机视觉-棋盘格标定
- v-show和v-if
- 【NOIP模拟】行走
- 马克扎克伯格节俭_马克·扎克伯格的垃圾实在很难抢
- 公钥 私钥 数字签名 CA证书