「AHOI2014/JSOI2014」支线剧情

传送门

上下界网络流。

以 \(1\) 号节点为源点 \(s\) ,新建一个汇点 \(t\),如果 \(u\) 能到 \(v\),那么连边 \(u \to v\),下界为 \(1\),上界为 \(+\infty\),费用为对应的所需时间,表示这段剧情至少看一次,且看一次代价为对应的所需时间。

又因为我们可以在任何一个节点重开一次,所以我们的每个节点 \(u\) 都连边 \(u \to t\) ,下界为 \(0\),上界为 \(+\infty\),费用也是 \(0\)。

然后我们就对建出来的网络跑一个有源汇有上下界可行流即可。

注意最后算答案的时候还要把每条边至少走一次的代价算进来。

参考代码:

#include <cstring>
#include <cstdio>
#include <queue>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 310, __ = 1e5 + 10, INF = 2147483647; int tot = 1, head[_]; struct Edge { int ver, cap, cst, nxt; } edge[__ << 1];
inline void Add_edge(int u, int v, int d, int cs) { edge[++tot] = (Edge) { v, d, cs, head[u] }, head[u] = tot; }
inline void link(int u, int v, int d, int cs) { Add_edge(u, v, d, cs), Add_edge(v, u, 0, -cs); } int n, s, t, S, T, d[_], pre[_], dis[_], exi[_]; inline void Link(int u, int v, int l, int r, int cs) { link(u, v, r - l, cs), d[u] -= l, d[v] += l; } inline int spfa() {
memset(dis + 1, 0x3f, sizeof (int) * T);
memset(pre + 1, 0, sizeof (int) * T);
queue < int > Q;
Q.push(S), dis[S] = 0, exi[S] = 1;
while (!Q.empty()) {
int u = Q.front(); Q.pop(), exi[u] = 0;
for (rg int i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].ver;
if (dis[v] > dis[u] + edge[i].cst && edge[i].cap > 0) {
dis[v] = dis[u] + edge[i].cst, pre[v] = i;
if (!exi[v]) exi[v] = 1, Q.push(v);
}
}
}
return pre[T] != 0;
} int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n), s = 1, t = n + 1, S = n + 2, T = n + 3;
int ans = 0;
for (rg int k, x, y, i = 1; i <= n; ++i) {
read(k);
while (k--) read(x), read(y), Link(i, x, 1, INF, y), ans += y;
}
for (rg int i = 1; i <= n; ++i) Link(i, t, 0, INF, 0);
link(t, s, INF, 0);
for (rg int i = s; i <= t; ++i) {
if (d[i] > 0) link(S, i, d[i], 0);
if (d[i] < 0) link(i, T, -d[i], 0);
}
while (spfa()) {
int flow = INF;
for (rg int i = pre[T]; i; i = pre[edge[i ^ 1].ver]) flow = min(flow, edge[i].cap);
for (rg int i = pre[T]; i; i = pre[edge[i ^ 1].ver]) edge[i].cap -= flow, edge[i ^ 1].cap += flow;
ans += dis[T] * flow;
}
printf("%d\n", ans);
return 0;
}

「AHOI2014/JSOI2014」支线剧情的更多相关文章

  1. 「JSOI2014」支线剧情2

    「JSOI2014」支线剧情2 传送门 不难发现原图是一个以 \(1\) 为根的有根树,所以我们考虑树形 \(\text{DP}\). 设 \(f_i\) 表示暴力地走完以 \(i\) 为根的子树的最 ...

  2. 「AHOI2014/JSOI2014」宅男计划

    「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...

  3. 「AHOI2014/JSOI2014」拼图

    「AHOI2014/JSOI2014」拼图 传送门 看到 \(n \times m \le 10^5\) ,考虑根号分治. 对于 \(n < m\) 的情况,我们可以枚举最终矩形的上下边界 \( ...

  4. 「AHOI2014/JSOI2014」奇怪的计算器

    「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...

  5. 「AHOI2014/JSOI2014」骑士游戏

    「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...

  6. [AHOI2014&&JSOI2014][bzoj3876] 支线剧情 [上下界费用流]

    题面 传送门 思路 转化模型:给一张有向无环图,每次你可以选择一条路径走,花费的时间为路径上边权的总和,问要使所有边都被走至少一遍(可以重复),至少需要花费多久 走至少一遍,等价于覆盖这条边 也就是说 ...

  7. BZOJ3876[Ahoi2014&Jsoi2014]支线剧情——有上下界的最小费用最大流

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

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

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

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

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 484  Solved: 296[Submit][Status ...

随机推荐

  1. session跨域共享问题解决方案

    在讨论 session 跨域共享问题之前,我们首先要了解 session 做了什么,没做什么 1.HTTP是无状态的,也就是说服务器不知道谁访问过他,但是有时间,又需要我们去保留这个状态比如说用户的登 ...

  2. Python学习之面向对象进阶

    面向对象进阶当然是要谈谈面向对象的三大特性:封装.继承.多态 @property装饰器 python虽然不建议把属性和方法都设为私有的,但是完全暴露给外界也不好,这样,我们给属性赋值的有效性九无法保证 ...

  3. web应用程序上传文件 超过了最大请求长度

    具体问题如下图 具体问题描述:在web应用程序中,上传了200M的文件,出现了如上图的问题,上传较小文件的时候,没有任何的问题.但是,测试的能力,不容小觑,真真的会测试的很全面.测试到了这个问题,好吧 ...

  4. eclipse好用的快捷键

    eclipse一些增加工作效率的快捷键(部分自己添加) eclipse如何修改快捷键 1. shift + enter | ctrl + shift + enter 在下/上方增加空行 2. ctrl ...

  5. 企业级Docker镜像仓库Harbor部署与使用

    yum install docker 官网地址:https://docs.docker.com/compose/install/ 运行此命令以下载Docker Compose的当前稳定版本 1 sud ...

  6. acwing练习

    220. 最大公约数 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对. GCD(x,y)即求x,y的最大公约数. 输入格式 输入一个整数N 输出格式 输出 ...

  7. mysql设置定时任务(对于中控心跳包的实现有意义)

    转载:https://www.cnblogs.com/laowu-blog/p/5073665.html 目前用途:因为 脚本正常开关会给中控发送消息 但是万一脚本被强制关闭 没有触发脚本关闭事件就无 ...

  8. MySQL的多表查询学习笔记

    一.案例准备 create table dept( id int primary key auto_increment, name ) ); insert into dept values(null, ...

  9. JIT对锁的优化- 锁消除和锁粗化案例分析

    锁消除和锁粗化案例分析 锁消除 直接上代码 /** * 描述: 锁粒度演示 * @author karl * @create 2020-02-11 14:38 */ public class MySy ...

  10. Django - Form嵌套的Meta类 + 为什么type()能创建类

    Form里面嵌套了一个Meta类 class PostForm(forms.ModelForm): class Meta: model = Post # field to be exposed fie ...