「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. nfs 动态文件挂载读写权限设置

    nfs 动态文件挂载读写权限设置 待办 ll 命令查看文件夹权限 参考设置共享文件夹https://www.linuxidc.com/Linux/2018-11/155331.htm

  2. Git - 后续

    1. 概述 现在讲了这些, 也就能应付一下日常的单机操作 后续大概会讲这些内容 分之间的 merge 本地仓库与远程仓库的互动

  3. 433B.Kuriyama Mirai's Stones

    Kuriyama Mirai has killed many monsters and got many (namely n) stones. She numbers the stones from  ...

  4. zookeeper集群搭建记录

    本文仅记录zookeeper集群搭建的过程,留待日后查看.使用. 一.硬件机器: 192.168.183.195 master-node 192.168.183.194 data-node1 192. ...

  5. UVA 10795 A Different Task(模拟)

    题目链接:https://vjudge.net/problem/UVA-10795 一道比较有思维含量的一道题: 注意一种分治的思想和“除了柱子x和柱子y之外的那个柱子”编号的问题. 首先在初始局面和 ...

  6. 自己centos7成功的修改了主机名(记录了该改哪些文件)

    1.更改/etc/hosts 方法(1)可以直接的去更改这个文件,更改的格式:直接vi编辑器打开,之后直接写上自己想要的主机名字就好,不用写成键值对的形式 [root@localhost etc]# ...

  7. Linux挂载(mount,umount及开机自动挂载

    挂载概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”,此目录即为“挂载点”,解除此关联关系的过程称之为“卸载” 1.挂载:根 ...

  8. python浅析对return的理解

    函数外部的代码要想获取函数的执行结果,就可以在函数里面用return语句,把结果返回. return 代表一个函数的终止,如果return 后面带一个print 或者return  ,则后面的不执行 ...

  9. websocket协议实现

    # websocket协议实现 1.抓包 wireshark规则: tcp.port == 9000 2. 结果解析 客户端请求: GET /ws/test_2 HTTP/1.1 Host: loca ...

  10. 深入理解Java虚拟机(1)

    Java内存区域 对于Java程序员来说,在虚拟机的自动内存管理机制下,不再需要为每一个new操作去写配对的delete和free代码,不容易出现内存泄露和内存溢出问题,可以直接交给虚拟机进行管理. ...