题意

传送门 P4043 [AHOI2014/JSOI2014]支线剧情

题解

游戏剧情构成一个 DAG,一次游戏花费的时间等于所走剧情路线花费的时间和。那么问题转化为边容量有上下界限制的最小费用流问题。设置超级汇点,与所有剧情点连边后,跑有源汇上下界最小费用流即可(基本思路是假设下界限制得到满足,然后尽量使流量平衡)。

#include <bits/stdc++.h>
using namespace std;
template <typename Cap, typename Cost>
struct MCF
{struct edge{int to;Cap cap;int rev;Cost cost;};int V;vector<vector<edge>> G;vector<Cost> h, ds;vector<int> prevv, preve;vector<bool> used;MCF(int n) : V(n), G(n), h(n), ds(n), prevv(n), preve(n), used(n) {}void add_edge(int from, int to, Cap cap, Cost cost){G[from].push_back({to, cap, (int)G[to].size(), cost});G[to].push_back({from, 0, (int)G[from].size() - 1, -cost});}pair<Cap, Cost> min_cost_flow(int s, int t, Cap f = numeric_limits<Cap>::max()){Cost res = 0;while (f > 0){priority_queue<pair<Cost, int>, vector<pair<Cost, int>>, greater<pair<Cost, int>>> q;fill(ds.begin(), ds.end(), numeric_limits<Cost>::max());fill(used.begin(), used.end(), 0);ds[s] = 0;q.push({0, s});while (!q.empty()){int v = q.top().second;q.pop();if (used[v])continue;used[v] = 1;for (int i = 0; i < (int)G[v].size(); ++i){auto &e = G[v][i];Cost d = ds[v] + e.cost + h[v] - h[e.to];if (e.cap > 0 && ds[e.to] > d){ds[e.to] = d;prevv[e.to] = v, preve[e.to] = i;q.push({d, e.to});}}}if (ds[t] == numeric_limits<Cost>::max())return {numeric_limits<Cap>::max() - f, res};for (int v = 0; v < V; ++v)h[v] += ds[v];Cap d = f;for (int v = t; v != s; v = prevv[v])d = min(d, G[prevv[v]][preve[v]].cap);f -= d;res += d * h[t];for (int v = t; v != s; v = prevv[v]){auto &e = G[prevv[v]][preve[v]];e.cap -= d;G[v][e.rev].cap += d;}}return {f, res};}
};template <typename Cap, typename Cost>
struct edge
{int to;Cap lb, ub;Cost cost;
};
vector<vector<edge<int, int>>> G;template <typename Cap, typename Cost>
pair<Cap, Cost> solve(int s, int t)
{int N = G.size();int S = N, T = S + 1;int V = T + 1;MCF<Cap, Cost> flow(V);vector<Cap> f(N);Cost add = 0;for (int v = 0; v < N; ++v)for (auto &e : G[v]){Cap x = e.lb;f[e.to] += x, f[v] -= x;add += x * e.cost;}Cap sum = 0;for (int v = 0; v < N; ++v){if (f[v] > 0){sum += f[v];flow.add_edge(S, v, f[v], 0);}else if (f[v] < 0)flow.add_edge(v, T, -f[v], 0);}for (int v = 0; v < N; ++v)for (auto &e : G[v])flow.add_edge(v, e.to, e.ub - e.lb, e.cost);flow.add_edge(t, s, numeric_limits<Cap>::max(), 0);auto res = flow.min_cost_flow(S, T);assert(sum == res.first);res.second += add;return res;
}int main()
{ios::sync_with_stdio(0), cin.tie(0);int N;cin >> N;G.resize(N + 1);int inf = 1e9;for (int i = 0; i < N; ++i){int k, b, t;cin >> k;for (int j = 0; j < k; ++j){cin >> b >> t;G[i].push_back({b - 1, 1, inf, t});}G[i].push_back({N, 0, inf, 0});}auto res = solve<int, int>(0, N);cout << res.second << '\n';return 0;
}

P4043 [AHOI2014/JSOI2014] 上下界最小费用流相关推荐

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

    传送门 约束每个点至少要经过一次,因此是上下界网络流. 每经过边都需要相应的边权,且要求耗费边权之和最小,因此是最小费用流. 存在多个终点,需要建立汇点 ttt ,因此是有源汇网络流. 即:有源汇上下 ...

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

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

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

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

  4. BZOJ 2055: 80人环游世界 [上下界费用流]

    2055: 80人环游世界 题意:n个点带权图,选出m条路径,每个点经过val[i]次,求最小花费 建图比较简单 s拆点限制流量m 一个点拆成两个,限制流量val[i],需要用上下界 图中有边的连边, ...

  5. 【BZOJ3876】[Ahoi2014]支线剧情 有上下界费用流

    [BZOJ3876][Ahoi2014]支线剧情 Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩 ...

  6. 【bzoj3876】【AHOI2014】【支线剧情】【有上下界的费用流】

    Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...

  7. [AHOI2014/JSOI2014]支线剧情

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

  8. 【学习笔记】上下界网络流

    零.前言 昨天刚刚被神秘建图方式打败了.今天又发现连知识点都没学完-- 学习知料:"人菜无水平" 国集学长太阳神.看上去像法语的家伙.网络流建模基础(只是挂个链接)."简 ...

  9. 有上下界的(费用)网络流全解

    有上下界的(费用)网络流 算法思想 无源汇上下界可行流 有源汇上下界最大流 有源汇上下界最小流 有源汇上下界最小费用可行流 训练 LibreOJ #115 LibreOJ #116 LibreOJ # ...

最新文章

  1. 细菌绝对定量的方法总结
  2. Mac下搭建solr搜索引擎与PHP扩展开发(上)
  3. 重理工c语言实验指导书答案,常熟理工学院 C语言程序设计实验实验指导书及答案...
  4. C语言实现哈希表(附完整源码)
  5. 利剑无意之面试题(三)
  6. 为你讲解ELK的组成与部署
  7. android 打开支付宝扫码页_Chrome 85正式版发布:新增标签页分组功,网页多了也不乱...
  8. java内存分配空间大小,JVM内存模型及内存分配过程
  9. cstring 不明确_股价不可预测明确时间点的涨跌
  10. docker mysql5.7 主从_docker-compose mysql5.7.30 主从
  11. 第四次作业——测试作业
  12. 贪心算法——字典序最小问题
  13. C++ std::shared_ptr是什么意思
  14. 计算机excel函数lookup,详细介绍数据查找VLookup函数在Excel中的应用举例
  15. magisk卸载内置软件_手机发烧友必备之 Magisk
  16. gigabyte计算机主板图解,技嘉主板BIOS如何设置及进入 技嘉主板BIOS设置图解教程(2)...
  17. Android10 mockLocation 模拟定位
  18. 一、markdown 常见公式
  19. java的StadIn函数_Java經典算法案例---Java深入
  20. idear配置工具上传Jar包到服务器并运行

热门文章

  1. 车辆出险保险索赔技巧——让每个车友都能学习
  2. arcgis 出图背景_ArcGIS入门教程来袭,零基础的同学快看过来!
  3. 百度App Android启动性能优化-工具篇
  4. 数据结构【一轮复习】---绪论(王道+天勤)
  5. wamp出现拒绝访问
  6. 网络编程中的基本概念
  7. 2020湖南省技能竞赛获奖名单_雄安新区网络安全技能竞赛举办!9人获奖!
  8. 2020年阴历二月二十九 投资理财之一入雪球就被坑
  9. Geospark电火花使用再记录
  10. 清明节全国哀悼,那么网站全部变灰是怎么实现的?