费用流

news/2025/10/24 12:31:13/文章来源:https://www.cnblogs.com/xihegudi/p/19162940

费用流

给定一个带费用的网络,规定 \((u,v)\) 间的费用为 \(f(u,v) \times w(u,v)\) ,求解该网络中总花费最小的最大流称之为最小费用最大流。总时间复杂度为 \(\mathcal O(NMf)\) ,其中 \(f\) 代表最大流。

struct MinCostFlow {using LL = long long;using PII = pair<LL, int>;const LL INF = numeric_limits<LL>::max();struct Edge {int v, c, f;Edge(int v, int c, int f) : v(v), c(c), f(f) {}};const int n;vector<Edge> e;vector<vector<int>> g;vector<LL> h, dis;vector<int> pre;MinCostFlow(int n) : n(n), g(n) {}void add(int u, int v, int c, int f) { // c 流量, f 费用// if (f < 0) {//     g[u].push_back(e.size());//     e.emplace_back(v, 0, f);//     g[v].push_back(e.size());//     e.emplace_back(u, c, -f);// } else {g[u].push_back(e.size());e.emplace_back(v, c, f);g[v].push_back(e.size());e.emplace_back(u, 0, -f);// }}bool dijkstra(int s, int t) {dis.assign(n, INF);pre.assign(n, -1);priority_queue<PII, vector<PII>, greater<PII>> que;dis[s] = 0;que.emplace(0, s);while (!que.empty()) {auto [d, u] = que.top();que.pop();if (dis[u] < d) continue;for (int i : g[u]) {auto [v, c, f] = e[i];if (c > 0 && dis[v] > d + h[u] - h[v] + f) {dis[v] = d + h[u] - h[v] + f;pre[v] = i;que.emplace(dis[v], v);}}}return dis[t] != INF;}pair<int, LL> flow(int s, int t) {int flow = 0;LL cost = 0;h.assign(n, 0);while (dijkstra(s, t)) {for (int i = 0; i < n; ++i) h[i] += dis[i];int aug = numeric_limits<int>::max();for (int i = t; i != s; i = e[pre[i] ^ 1].v) aug = min(aug, e[pre[i]].c);for (int i = t; i != s; i = e[pre[i] ^ 1].v) {e[pre[i]].c -= aug;e[pre[i] ^ 1].c += aug;}flow += aug;cost += LL(aug) * h[t];}return {flow, cost};}
};  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图论常见结论及例题

图论常见结论及例题 常见结论要在有向图上求一个最大点集,使得任意两个点 \((i,j)\) 之间至少存在一条路径(可以是从 \(i\) 到 \(j\) ,也可以反过来,这两种有一个就行),即求解最长路;要求出连通图上的任意一棵生…

查询GPIO状态值(步骤)

查询GPIO状态值(步骤)1.导出GPIO(如果还没有被导出): echo 31 > /sys/class/gpio/export 2.查询是否导出成功 ls -lh /sys/class/gpio/gpio31 如果出现gpio31文件夹,说明gpio导出成功。开机时导出一次即可 3.查…

最长路(topsort+DP算法)

最长路(topsort+DP算法) 计算一张 \(\tt DAG\) 中的最长路径,在执行前可能需要使用 \(\tt tarjan\) 重构一张正确的 \(\tt DAG\) ,复杂度 \(\mathcal O(N+M)\) 。 struct DAG {int n;vector<vector<pair<…

最短路径树(SPT问题)

最短路径树(SPT问题)定义:在一张无向带权联通图中,有这样一棵生成树:满足从根节点到任意点的路径都为原图中根到任意点的最短路径。 性质:记根节点 \(Root\) 到某一结点 \(x\) 的最短距离 \(dis_{Root,x}\) ,在…

欧拉路径/欧拉回路 Hierholzers

欧拉路径/欧拉回路 Hierholzers欧拉路径:一笔画完图中全部边,画的顺序就是一个可行解;当起点终点相同时称欧拉回路。有向图欧拉路径存在判定 有向图欧拉路径存在:\(\tt ^1\) 恰有一个点出度比入度多 \(1\) (为起点…

无源汇点的最小割问题 Stoer–Wagner

无源汇点的最小割问题 Stoer–Wagner也称为全局最小割。定义补充(与《网络流》中的定义不同): 割:是一个边集,去掉其中所有边能使一张网络流图不再连通(即分成两个子图)。通过递归的方式来解决无向正权图上的全…

染色法判定二分图 (dfs算法)

染色法判定二分图 (dfs算法) 判断一张图能否被二分染色。 vector<int> vis(n + 1); auto dfs = [&](auto self, int x, int type) -> void {vis[x] = type;for (auto y : ver[x]) {if (vis[y] == type) {…

链式前向星建图与搜索

链式前向星建图与搜索 很少使用这种建图法。\(\tt dfs\) :标准复杂度为 \(\mathcal O(N+M)\)。节点子节点的数量包含它自己(至少为 \(1\)),深度从 \(0\) 开始(根节点深度为 \(0\))。\(\tt bfs\) :深度从 \(1\) …

一般图最大匹配

一般图最大匹配(带花树算法) 与二分图匹配的差别在于图中可能存在奇环,时间复杂度与边的数量无关,为 \(\mathcal O(N^3)\) 。下方模板编号从 \(0\) 开始,例题为 UOJ #79. 一般图最大匹配 。 struct Graph {int n;…

CF2152G

有一棵以 \(1\) 为根, \(n\) 个节点的树,每个节点有一个颜色白/黑。给定 \(q\) 组询问,每组询问给了一个 \(u\),表示将 \(u\) 子树内的点的颜色全部翻转。每次操作后回答至少需要几条从根开始的链才能覆盖所有黑点…

缩点(Tarjan 算法)

缩点(Tarjan 算法) (有向图)强连通分量缩点 强连通分量缩点后的图称为 SCC。以 \(\mathcal O (N + M)\) 的复杂度完成上述全部操作。性质:缩点后的图拥有拓扑序 \(color_{cnt}, color_{cnt-1},…,1\) ,可以不需再…

平面图最短路(对偶图)

平面图最短路(对偶图) 对于矩阵图,建立对偶图的过程如下(注释部分为建立原图),其中数据的给出顺序依次为:各 \(n(n+1)\) 个数字分别代表从左向右、从上向下、从右向左、从下向上的边。 for (int i = 1; i <=…

多源汇最短路(APSP问题)

多源汇最短路(APSP问题) 使用邻接矩阵存图,可以处理负权边,以 \(\mathcal{O}(N^3)\) 的复杂度计算。注意,这里建立的是单向边,计算双向边需要额外加边。 const int N = 210; int n, m, d[N][N];void floyd() {fo…

最小生成树(MST问题)

最小生成树(MST问题) (稀疏图)Prim算法 使用邻接矩阵存图,以 \(\mathcal{O}(N^2+M)\) 的复杂度计算,思想与 \(\tt djikstra\) 基本一致。 const int N = 550, INF = 0x3f3f3f3f; int n, m, g[N][N]; int d[N], v…

常见概念

常见概念oriented graph:有向图 bidirectional edges:双向边平面图:若能将无向图 \(G=(V,E)\) 画在平面上使得任意两条无重合顶点的边不相交,则称 \(G\) 是平面图。 无向正权图上某一点的偏心距:记为 \(ecc(u) = …

单源最短路径(SSSP问题)

单源最短路径(SSSP问题) (正权稀疏图)动态数组存图+Djikstra算法 使用优先队列优化,以 \(\mathcal O(M\log N)\) 的复杂度计算。 vector<int> dis(n + 1, 1E18); auto djikstra = [&](int s = 1) ->…

CNCF项目记录2025-10

毕业项目持续集成与交付:argo、flux 安全与规范:cert-manager、Falco、in-toto、Open Policy Agent、tuf 云原生网络:cilium 流式消息:cloudevents 容器运行时:containerd、cri-o 服务发现:CoreDNS、etcd 云原生…

代理

代理是一种设计模式StarService.java package com.itheima.demo4proxy; // 明星行为接口 public interface StarService {void sing(String name);String dance(); }Star.java package com.itheima.demo4proxy;import …

双碳目标下,MyEMS 为何成为制造企业的 “刚需工具”?

在 “碳达峰、碳中和” 目标全面推进的背景下,制造业作为能源消耗和碳排放的核心领域,正面临前所未有的减排压力与转型挑战。据统计,我国制造业能耗占全国总能耗的 60% 以上,碳排放占比超 50%—— 这意味着,制造业…

树上路径交

树上路径交 计算两条路径的交点数量,直接载入任意 LCA 封装即可。 int intersection(int x, int y, int X, int Y) {vector<int> t = {lca(x, X), lca(x, Y), lca(y, X), lca(y, Y)};sort(t.begin(), t.end());…