BZOJ 3876 支线剧情
支线剧情
【故事背景】
宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等。不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情。这些游戏往往都有很多的支线剧情,现在JYY想花费最少的时间看完所有的支线剧情。
【问题描述】
JYY现在所玩的RPG游戏中,一共有N个剧情点,由1到N编号,第i个剧情点可以根据JYY的不同的选择,而经过不同的支线剧情,前往Ki种不同的新的剧情点。当然如果为0,则说明i号剧情点是游戏的一个结局了。
JYY观看一个支线剧情需要一定的时间。JYY一开始处在1号剧情点,也就是游戏的开始。显然任何一个剧情点都是从1号剧情点可达的。此外,随着游戏的进行,剧情是不可逆的。所以游戏保证从任意剧情点出发,都不能再回到这个剧情点。由于JYY过度使用修改器,导致游戏的“存档”和“读档”功能损坏了,
所以JYY要想回到之前的剧情点,唯一的方法就是退出当前游戏,并开始新的游戏,也就是回到1号剧情点。JYY可以在任何时刻退出游戏并重新开始。不断开始新的游戏重复观看已经看过的剧情是很痛苦,JYY希望花费最少的时间,看完所有不同的支线剧情。
【输入格式】
输入一行包含一个正整数N。
接下来N行,第i行为i号剧情点的信息;
第一个整数为,接下来个整数对,Bij和Tij,表示从剧情点i可以前往剧
情点,并且观看这段支线剧情需要花费的时间。
【输出格式】
输出一行包含一个整数,表示JYY看完所有支线剧情所需要的最少时间。
【样例输入】
6
2 2 1 3 2
2 4 3 5 4
2 5 5 6 6
0
0
0
【样例输出】
24
【样例解释】
JYY需要重新开始3次游戏,加上一开始的一次游戏,4次游戏的进程是
1->2->4,1->2->5,1->3->5和1->3->6。
对于100%的数据满足N<=300,0<=Ki<=50,1<=Tij<=300,Sigma(Ki)<=5000
题解:
题意就是要求走完所有边所需的最小时间(费用)
相当于有上下界无源汇可行最小费用流
那么就把题目中给定的边下界设为 1
重新开始就从每一个点连向点 1 就好了
具体见图可看代码
对于超级源与超级汇的连边也一起连在里面了
- #include<cmath>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int maxn = 1e3 + ;
- const int maxm = 3e4 + ;
- const int inf = 1e9 + ;
- int n;
- int s, t, nors, nort, sups, supt;
- int du[maxn];
- int len;
- int nex[maxm], fir[maxn], ver[maxm], con[maxm], val[maxm];
- bool vis[maxn];
- int que[maxm << ], dis[maxn];
- int ans;
- inline void Scan(int &x)
- {
- char c;
- bool o = false;
- while(!isdigit(c = getchar())) o = (c != '-') ? o : true;
- x = c - '';
- while(isdigit(c = getchar())) x = x * + c - '';
- if(o) x = -x;
- }
- inline void Add(int x, int y, int c, int w)
- {
- nex[++len] = fir[x];
- fir[x] = len;
- ver[len] = y;
- con[len] = c;
- val[len] = w;
- }
- inline void Ins(int x, int y, int c, int w)
- {
- Add(x, y, c, w);
- Add(y, x, , -w);
- }
- inline void Sup(int x, int y, int l, int r, int w)
- {
- if(l) du[x] -= l, du[y] += l;
- if(l != r) Ins(x, y, r - l, w);
- }
- inline bool Spfa()
- {
- int head = , tail = ;
- for(int i = ; i <= supt; ++i)
- dis[i] = inf, vis[i] = false;
- que[tail] = s;
- dis[s] = ;
- vis[s] = true;
- while(head < tail)
- {
- int u = que[++head];
- for(int i = fir[u]; i; i = nex[i])
- {
- if(!con[i]) continue;
- int v = ver[i];
- if(dis[v] > dis[u] + val[i])
- {
- dis[v] = dis[u] + val[i];
- if(!vis[v])
- {
- vis[v] = true;
- que[++tail] = v;
- }
- }
- }
- vis[u] = false;
- }
- return dis[t] < inf;
- }
- int Dinic(int u, int f)
- {
- vis[u] = true;
- if(u == t) return f;
- int g = f;
- for(int i = fir[u]; i; i = nex[i])
- {
- if(!con[i]) continue;
- int v = ver[i];
- if(vis[v] || dis[v] != dis[u] + val[i]) continue;
- int h = Dinic(v, min(con[i], g));
- if(h)
- {
- con[i] -= h;
- con[i ^ ] += h;
- g -= h;
- ans += h * val[i];
- if(!g) return f;
- }
- }
- return f - g;
- }
- inline int Flow(int x, int y)
- {
- s = x, t = y, ans = ;
- while(Spfa()) Dinic(s, inf);
- return ans;
- }
- inline void Init()
- {
- len = ;
- nors = n << | ;
- nort = nors + ;
- sups = nort + ;
- supt = sups + ;
- }
- int main()
- {
- Scan(n);
- int m, x, t;
- Init();
- for(int i = ; i <= n; ++i)
- {
- Scan(m);
- Ins(i, supt, m, );
- while(m--)
- {
- Scan(x), Scan(t);
- Sup(i, x, , inf, t);
- Ins(sups, x, , t);
- }
- if(i != ) Ins(i, , inf, );
- }
- printf("%d", Flow(sups, supt));
- }
BZOJ 3876 支线剧情的更多相关文章
- BZOJ 3876 支线剧情 | 有下界费用流
BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...
- BZOJ 3876 支线剧情(有上下界的无源汇最小费用可行流)
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1783 Solved: 1079 [Submit][St ...
- BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流
题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...
- bzoj 3876 [Ahoi2014]支线剧情(有上下界的最小费用流)
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 484 Solved: 296[Submit][Status ...
- BZOJ 3876: [Ahoi2014]支线剧情 [上下界费用流]
3876: [Ahoi2014]支线剧情 题意:每次只能从1开始,每条边至少经过一次,有边权,求最小花费 裸上下界费用流...每条边下界为1就行了 注意要加上下界*边权 #include <io ...
- BZOJ 3876: [Ahoi2014]支线剧情 带下界的费用流
3876: [Ahoi2014]支线剧情 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3876 Description [故事背景] 宅 ...
- BZOJ 3876:支线剧情(有下界最小费用最大流)
3876: [Ahoi2014]支线剧情 Description [故事背景]宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧 ...
- BZOJ 3876 【AHOI2014】 支线剧情
题目链接:支线剧情 这道题就是一道裸裸的上下界网络流……只不过这道题边带了权,那么建出图之后跑费用流即可. 首先需要新建超级源\(S\)和超级汇\(T\).对于这道题,对于一条边\((u,v,z)\) ...
- 支线剧情(bzoj 3876)
Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...
随机推荐
- 2018.11.3 Nescafe18 T1 七夕祭
题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是 TYVJ 今年举办了一次线下七夕祭.Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕,于是他们决定去 TYVJ七夕祭游玩. ...
- Mysql 查询出某列字段 被包含于 条件数据中
我们通常是使用 某条件 是否包含于 某列中 ,简单点 就是:select * from 表名 where 字段名 like '%条件数据%'; 现在说下 某列 被包含于 条件数据中 接下 ...
- 二十、Mysql 连接的使用
Mysql 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据. 本章节我们将向大家介绍如何使用 MySQL 的 JOIN ...
- HashMap 排序
本文章,摘抄自:2018黑马程序最新面试题汇总 已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性.请写一个方法实现 ...
- js测试密码的强度
测试密码的强度.js //网站也会根据输入密码的字符特点给出相应的提示,如密码过短.强度差.强度中等.强度强等. //这又是怎么实现的呢?看下面代码: <input type="pas ...
- Vue钩子函数生命周期实例详解
vue生命周期简介 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁 ...
- Python编写一个程序求2的次方
#!/usr/bin/env python3 #-*- coding:utf-8 -*- #":"冒号后面为对参数注释,"->"为对整个函数注释 def ...
- 获取获取docker的文件
1.docke实例内mysql 导出文件 mysql -h yourhost -P yourport -u user -p dbname -e "select * from employee ...
- windows服务自动备份数据库
最近写了几个windows服务用于自动备份与删除数据: services代码如下: public partial class Service1 : ServiceBase { public Servi ...
- 【Search In Rotated Sorted Array】cpp
题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...