传送门

约束每个点至少要经过一次,因此是上下界网络流。

每经过边都需要相应的边权,且要求耗费边权之和最小,因此是最小费用流。

存在多个终点,需要建立汇点 ttt ,因此是有源汇网络流。

即:有源汇上下界最小费用可行流。

建图

本题中结点 111 即可作为源点。

对于原图中存在的所有边,建下界为 111,上界为 infinfinf ,费用为对应边权的边。

由于存在多个终点,需要建立汇点 t1t1t1,将除了 111 号点外的所有边向 t1t1t1 连容量为 infinfinf 费用为 000 的边。

新建平衡源点 s2s2s2 和平衡汇点 t2t2t2,使原图中的点流量平衡。(具体原理和操作可见:网络流中有关上下界限制的学习笔记)

跑平衡源点 s2s2s2 到平衡汇点 t2t2t2 的最小费用最大流,即为可行流。注意由于每个边的下界为 111 ,因此最终答案还需要加上所有边的费用 ∗1*1∗1。


参考代码

#include <bits/stdc++.h>
#define itn int
#define int long long
#define endl "\n"
#define PII pair<int, int>
using namespace std;
const int N = 2e5 + 10;
const int M = 5e4 + 10;
const itn inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
// const int mod = 998244353;template <int N>
struct MCMF {struct E {int to, cap, val, inv;};vector<E> g[N];int dis[N], now[N], h[N], pre[N], preu[N];void add(int u, int v, int f, int w) {g[u].push_back({v, f, w, (int)g[v].size()});g[v].push_back({u, 0, -w, (int)g[u].size() - 1});}void dijkstra(int st) {priority_queue<pair<int, int>, vector<pair<int, int>>,greater<pair<int, int>>>q;memset(dis, 0x3f, sizeof dis);memset(pre, -1, sizeof pre);memset(preu, -1, sizeof preu);dis[st] = 0;q.push({0, st});while (q.size()) {// auto [d, u] = q.top();auto qnow = q.top();int d = qnow.first, u = qnow.second;q.pop();if (dis[u] < d)continue;int x = 0;for (auto gnow : g[u]) {int v = gnow.to, f = gnow.cap, w = gnow.val, inv = gnow.inv;if (f && dis[v] > dis[u] + w + h[u] - h[v]) {dis[v] = dis[u] + h[u] - h[v] + w;pre[v] = x;preu[v] = u;q.push({dis[v], v});}x++;}}}pair<int, int> min_cost_max_flow(int st, int ed) {memset(h, 0, sizeof h);for (int flow = 0, cost = 0, res = inf;; res = inf) {dijkstra(st);if (dis[ed] > inf)return {flow, cost};for (int i = 0; i < N; i++) {h[i] += dis[i];}for (int i = ed; i != st; i = preu[i]) {res = min(res, g[preu[i]][pre[i]].cap);}flow += res;cost += res * h[ed];for (int i = ed; i != st; i = preu[i]) {g[i][g[preu[i]][pre[i]].inv].cap += res;g[preu[i]][pre[i]].cap -= res;}}}
};
MCMF<505> mcmf;
int n, m, s1, t1, s2, t2;
int in[N];void ins(int u, int v, int l, int r, int w) {mcmf.add(u, v, r - l, w);in[u] -= l, in[v] += l;
}void solve() {cin >> n;s1 = n + 1, t1 = n + 2;s2 = n + 3, t2 = n + 4;int sum = 0;for (int i = 1; i <= n; i++) {int k;cin >> k;while (k--) {int v, w;cin >> v >> w;ins(i, v, 1, inf, w);sum += w;}}for (int i = 2; i <= n; i++) {mcmf.add(i, t1, inf, 0);}for (int i = 1; i <= t1; i++) {if (in[i] < 0)mcmf.add(i, t2, -in[i], 0);else if (in[i] > 0)mcmf.add(s2, i, in[i], 0);}mcmf.add(t1, 1, inf, 0);cout << mcmf.min_cost_max_flow(s2, t2).second + sum;
}signed main() {ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);cout << fixed << setprecision(12);// init();int T = 1;// cin >> T;while (T--) {solve();}return 0;
}

P4043 [AHOI2014/JSOI2014]支线剧情(有源汇上下界最小费用可行流)相关推荐

  1. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  2. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  3. CCF201812-5 管道清洁【无源汇上下界最小费用可行流】

    上下界费用流板子题,不赘述 感觉最重要的一个点 是题目要求回到一号点 我们这样的连边 恰好保证了要求 #include <bits/stdc++.h> using namespace st ...

  4. bzoj 4108: [Wf2015]Catering|带上下界最小费用可行流

    终于搞懂 上下界网络流了! 注意边的数量 #include <cstdio> #include <cstring> #include <iostream> #inc ...

  5. HDU 3157 Crazy Circuits(有源汇上下界最小流)

    HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...

  6. 有上下界网络流 ---- P4843 清理雪道(DAG图上最小路径重复边覆盖)【模板】有源汇上下界最小流

    题目链接 题目大意: 解题思路: 首先我们发现对于每条边至少要覆盖一次,最多覆盖无数次 那么就有点像上下界网络流了[1,INF][1,INF][1,INF]的限制关系 跑一边最小流就可以了!! #in ...

  7. 洛谷 - P4043 [AHOI2014/JSOI2014]支线剧情(最小费用可行流)

    题目链接:点击查看 题目大意:给出一张 n 个点的有向图,每条边都有边权,现在要求将每条边至少遍历一遍,问最小的边权为多少 题目分析:建图时将每条边都设置流量为 [ 1 , inf ] ,就变成最小费 ...

  8. [AHOI2014/JSOI2014]支线剧情

    [AHOI2014/JSOI2014]支线剧情 有n个剧情点,对于第i个剧情点有ki个分支,分别通往tij剧情点,耗费时间为bij.从1号点开始,可以从任何节点返回1号点,要遍历所有的边的最少耗费时间 ...

  9. 有下界的最小费用可行流2.0(bzoj 3876: [Ahoi2014]支线剧情)

    什么是有下界的最小费用可行流? 平时来讲都是最小费用最大流,也就是在满流的前提条件下费用尽可能的少,而最小费用可行流一般不要求满流,但是每条边都有最小流量要求(比如经过边e(u,v)的流量不能少于4等 ...

最新文章

  1. 史上最全的数据库面试题,不看后悔篇!
  2. 百战百胜:人生10个成功秘诀
  3. 信息安全管理体系 ISMS
  4. 如何为网站设置站点图标
  5. 4键键盘(Leetcode651)
  6. wpf中:xaml中的命名空间的引入方法
  7. Python开发【第六篇】:模块
  8. WASM 成为 HTML、CSS 与 JS 之后的第 4 门 Web 语言
  9. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
  10. dbname, instance, sid
  11. 对自己的python项目配置PYTHONPATH
  12. 状态机与马尔科夫模型
  13. vbs如何调用c语言函数,VBS编程教程 (第6篇)
  14. 手机和工业计算机运算能力对比,手机CPU和电脑CPU性能相差多少 手机CPU和电脑CPU性能对比...
  15. 模拟布朗运动与几何布朗运动
  16. 计算机键盘能直接接手机吗,手机变电脑!智能手机外接键盘和鼠标的3种方法...
  17. 【游戏开发引擎】 实验3:Captain Blaster 2D 滚动射击游戏
  18. nginx的带宽限制和并发控制
  19. oracle create table not null,oracle – 不能在CREATE TABLE中使用内联约束
  20. Android Studio初学者实例:RecyclerView学习--模仿今日头条

热门文章

  1. 3t硬盘装linux系统,主板不支持3TB硬盘?用个软件搞定它
  2. ipset如何与netfilter内核模块进行通信
  3. 计算机新生导论感言,大学生感言与寄语新生
  4. struts中的redirect=true与redirect=false
  5. 安全、性能测试常见问题与注意事项
  6. 兼容chrome、firebox、IE阻止冒泡问题
  7. U盘容量从16G变成8M解决办法
  8. VS无法下载,提示无法连接到网络
  9. ue4 后期处理景深_Unreal Engine4 后期处理特效 VOL1
  10. 拒绝年费自己组建MarkdownNice转微信公众号格式神器