http://www.lydsy.com/JudgeOnline/problem.php?id=3876

这道题每条支线的意思是每条边。。。

那么每条边的下界设为1就行了。

这样建出一个DAG,每条边下界为1,上界为正无穷,赋上费用。设1为S。所有点向T连边,下界为0,上界为正无穷,费用为0,表示可以随时退出。答案是这个图中的最小费用可行流。

最小费用可行流怎么求啊!

可行流什么的我只会求无源汇的。

想了好半天才明白该怎么做。。。

抛弃原来的建图,还是建出一个DAG,每条边下界为1,上界为正无穷,赋上费用。所有非1的点都向1连一条下界为0上界无穷费用为0的边,表示可以随时退出回到1点。

这样就是无源汇的啦!

我们要求这个新的图(附加网络)的最小费用可行流。

可行流我会求(套模板),设超级源S和超级汇T,每个点的入点下界和减去出点下界和,记为di。如果di小于0,从i连边向T,容量为-di;如果di大于0,从S连边向i,容量为di(都是模板的内容~)

从超级源到超级汇跑最大流,跑出来的就是可行流减去下界的流量。因为题意,所以肯定有解;又因为是DAG,所以可行流就是最小流。

如果要求最小费用可行流?不断spfa增广就可以实现最小费用了!

这样对于一条边的流量f=d+g,f为可行流的流量,d为下界,g为附加网络中实际的流量。

求出的最小费用是\(\sum_{i∈E}g_i*w_i\),并不是我们想要的f!

怎么办呢?因为所有的d一定会流满,所以直接加上\(\sum_{i∈E}d_i*w_i\)即可!(我好蠢啊,想了一晚上)

附赠样例图示:

6
2 2 1 3 2
2 4 3 5 4
2 5 5 6 6
0
0
0

附加网络是介个样子的:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 333;
const int M = N * N;
const int inf = 0x7fffffff; struct node {
int nxt, to, c, w, from;
} E[M]; int cnt = 1, point[N]; void ins(int u, int v, int c, int w) {
E[++cnt] = (node) {point[u], v, c, w, u}; point[u] = cnt;
E[++cnt] = (node) {point[v], u, 0, -w, v}; point[v] = cnt;
} bool inq[N];
int dist[N], pre[N], q[N]; bool spfa(int s, int t) {
for (int i = 1; i <= t; ++i) dist[i] = inf;
int head = 0, tail = 1, u, v, tt;
dist[s] = 0; inq[s] = true; q[1] = s;
while (head != tail) {
++head; if (head == N) head = 0;
u = q[head]; inq[u] = false;
for (int i = point[u]; i; i = E[i].nxt)
if (E[i].c && dist[v = E[i].to] > (tt = dist[u] + E[i].w)) {
dist[v] = tt; pre[v] = i;
if (!inq[v]) {
inq[v] = true;
++tail; if (tail == N) tail = 0;
q[tail] = v;
}
}
}
return dist[t] != inf;
} int MCMF(int s, int t) {
int ret = 0;
while (spfa(s, t)) {
int f = inf, u;
for (u = t; u != s; u = E[pre[u]].from) f = min(f, E[pre[u]].c);
for (u = t; u != s; u = E[pre[u]].from) E[pre[u]].c -= f, E[pre[u] ^ 1].c += f;
ret += dist[t] * f;
}
return ret;
} int n, du[N], S, T, ans = 0; int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
int tot, bi, ti; scanf("%d", &tot);
du[i] -= tot;
while (tot--) {
scanf("%d%d", &bi, &ti);
ins(i, bi, inf, ti);
++du[bi]; ans += ti;
}
if (i != 1) ins(i, 1, inf, 0);
} S = n + 1; T = S + 1;
for (int i = 1; i <= n; ++i) {
if (du[i] > 0) ins(S, i, du[i], 0);
if (du[i] < 0) ins(i, T, -du[i], 0);
} printf("%d\n", MCMF(S, T) + ans);
return 0;
}

QAQ终于写完了,那么接下来我们

【BZOJ 3876】【AHOI 2014】支线剧情的更多相关文章

  1. BZOJ 3876 [AHOI/JSOI2014]支线剧情 (最小费用可行流)

    题面:洛谷传送门 BZOJ传送门 题目大意:给你一张有向无环图,边有边权,让我们用任意条从1号点开始的路径覆盖这张图,需要保证覆盖完成后图内所有边都被覆盖至少一次,求覆盖路径总长度的最小值 最小费用可 ...

  2. bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】

    每条边流量有下界有费用,很显然是有上下界有源汇最小费用最大流 连边(s,1,(0,inf),0),(i,t,(0,inf),0),表示从1出发inf次从每个点结束inf次 连边(i,j,(1,inf) ...

  3. BZOJ 3876 [Ahoi2014&Jsoi2014]支线剧情

    题解: 带下界的费用流 对于x->y边权为z Addedge(x,t,1,0) Addedge(s,y,1,z) Addedge(x,y,inf,0) 然后对每个点Addedge(i,1,inf ...

  4. BZOJ3876 AHOI/JSOI2014支线剧情(上下界网络流)

    原图所有边下界设为1上界设为inf花费为时间,那么显然就是一个上下界最小费用流了.做法与可行流类似. 因为每次选的都是最短路增广,且显然不会有负权增广路,所以所求出来的可行流的费用就是最小的. #in ...

  5. BZOJ 3876 支线剧情 | 有下界费用流

    BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...

  6. BZOJ 3876 支线剧情(有上下界的无源汇最小费用可行流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1783  Solved: 1079 [Submit][St ...

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

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

  8. BZOJ 3876: [Ahoi2014]支线剧情 [上下界费用流]

    3876: [Ahoi2014]支线剧情 题意:每次只能从1开始,每条边至少经过一次,有边权,求最小花费 裸上下界费用流...每条边下界为1就行了 注意要加上下界*边权 #include <io ...

  9. BZOJ 3876: [Ahoi2014]支线剧情 带下界的费用流

    3876: [Ahoi2014]支线剧情 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3876 Description [故事背景] 宅 ...

  10. BZOJ 3876:支线剧情(有下界最小费用最大流)

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

随机推荐

  1. C#开发微信门户及应用(1)--开始使用微信接口

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...

  2. python 添加tab补全

    在平时查看Python方法用到tab补全还是很方便的. 1. mac 平台 配置如下: mac是类Unix平台,需要在添加一条配置内容到bash_profile 中(默认是没有这个文件,可以新建一个放 ...

  3. windows7命令帮助大全

    有关某个命令的详细信息,请键入 HELP 命令名ASSOC 显示或修改文件扩展名关联.ATTRIB 显示或更改文件属性.BREAK 设置或清除扩展式 CTRL+C 检查.BCDEDIT 设置启动数据库 ...

  4. 如何在Windows Server 2008 R2 SP1安装Redis-x64-3.2.100,并且自动注册服务

    1.官网:http://redis.io/ 2.下载地址:https://github.com/MSOpenTech/redis/releases 3.最新的安装包: 4.点击msi文件开始安装. 5 ...

  5. java 开发业务逻辑的思考(1)- 通知短信发送

    坚持每天写一个总结的博客,今天又是一个新的开始! 今天我要说的是一个关于发送短信通知发送的问题.具体的业务流程是这样的,现在需要对用户的一个提现的申请进行审核,审核的内部需要控制很多的业务, 1.检查 ...

  6. Atitit Atitit.软件兼容性原理----------API兼容 Qa7

    Atitit Atitit.软件兼容性原理----------API兼容 Qa7 1. 兼容性的重要性与反面教材1 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法 ...

  7. [deviceone开发]-openPage的动画效果示例

    一.简介do_App的openPage支持16种过场动画,这个示例直观的展示16种动画的效果.适合初学者.二.效果图三.相关下载https://github.com/do-project/code4d ...

  8. MapFile生成WMS

    MAP  NAME "HBWMS"  STATUS ON  SIZE 800 600  EXTENT 107.795 28.559 116.977 33.627  UNITS ME ...

  9. Atitit.数据检索与网络爬虫与数据采集的原理概论

    Atitit.数据检索与网络爬虫与数据采集的原理概论 1. 信息检索1 1.1. <信息检索导论>((美)曼宁...)[简介_书评_在线阅读] - dangdang.html1 1.2. ...

  10. ListView之点击展开菜单

    一.概述 ListView点击item显示菜单是要实现这样的效果: 需要实现的逻辑如下: 1)点击一个普通item,展开当前菜单,同时关闭其他菜单 2)点击一个已展开的菜单,隐藏当前菜单 3)将展开菜 ...