Description

 【故事背景】
长期的宅男生活中,JYY又挖掘出了一款RPG游戏。在这个游戏中JYY会
扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽。
【问题描述】
在这个游戏中,JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻
击。两种攻击方式都会消耗JYY一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一个或更多同样的怪兽;而采用法术攻击则可以彻底将一个怪兽杀死。当然了,一般来说,相比普通攻击,法术攻击会消耗更多的体力值(但由于游戏系统bug,并不保证这一点)。
游戏世界中一共有N种不同的怪兽,分别由1到N编号,现在1号怪兽入
侵村庄了,JYY想知道,最少花费多少体力值才能将所有村庄中的怪兽全部杀死呢?
 

Input

第一行包含一个整数N。
接下来N行,每行描述一个怪兽的信息;
其中第i行包含若干个整数,前三个整数为Si,Ki和Ri,表示对于i号怪兽,
普通攻击需要消耗Si的体力,法术攻击需要消耗Ki的体力,同时i号怪兽死亡后会产生Ri个新的怪兽。表示一个新出现的怪兽编号。同一编号的怪兽可以出现多个。
 

Output

输出一行一个整数,表示最少需要的体力值。

 

Sample Input

4
4 27 3 2 3 2
3 5 1 2
1 13 2 4 2
5 6 1 2

Sample Output

26

HINT

【样例说明】
首先用消耗4点体力用普通攻击,然后出现的怪兽编号是2,2和3。花费
10点体力用法术攻击杀死两个编号为2的怪兽。剩下3号怪兽花费1点体力进
行普通攻击。此时村庄里的怪兽编号是2和4。最后花费11点体力用法术攻击
将这两只怪兽彻底杀死。一共花费的体力是4+5+5+1+5+6=26。
【数据范围】
2<=N<=2*10^5,1<=Ri,Sigma(Ri)<=10^6,1<=Ki,Si<=5*10^14

Source


题目大意

  一共有$n$种怪兽,第$i$种怪兽遭到普通攻击后会分裂成若干个小怪兽,会被法术攻击彻底消灭。对于每种怪兽使用法术攻击和普通攻击消耗的体力值是不同的。

  现在,1只种类为1的怪兽入侵村庄,问彻底消灭村庄内的怪兽至少需要的体力值。

  依稀记得以前有过spfa套dp的脑洞,但没想到真有人出这么一道题  

  显然可以看见动态规划的影子,以及显而易见的方程:

$f[i] = \max \left(k_{i}, s_{i} + \sum_{j}f[j] \right ) $

  真棒,转移有环。那么可以解方程吗?至少我不会,这里可要做决策。

  那看看最短路的动态规划的方程

$f[i] = \min\left \{ f[j] + w\left(j, i \right ) \right \}$

  显然它也是有环的。但是spfa通过反复进行更新来得到最优解,即当一个状态被更新后,就把它放入队列去更新它的后继状态。

  这道题也可以采用同样的做法。

Code

 /**
* bzoj
* Problem#3875
* Accepted
* Time: 5496ms
* Memory: 22764k
*/
#include <bits/stdc++.h>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean;
#define ll long long int n;
ll *ss;
vector<int> *suf;
vector<int> *pre;
ll* f;
queue<int> que; inline void init() {
scanf("%d", &n);
f = new ll[(n + )];
ss = new ll[(n + )];
suf = new vector<int>[(n + )];
pre = new vector<int>[(n + )];
for (int i = , u, x; i <= n; i++) {
scanf(Auto""Auto"%d", ss + i, f + i, &u);
while (u--) {
scanf("%d", &x);
suf[i].push_back(x);
pre[x].push_back(i);
}
}
} boolean *vis;
void spfa() {
vis = new boolean[(n + )];
memset(vis, true, sizeof(boolean) * (n + ));
for (int i = ; i <= n; i++)
que.push(i);
while (!que.empty()) {
int e = que.front();
ll cmp = ss[e];
que.pop();
vis[e] = false;
for (int i = ; i < (signed) suf[e].size(); i++)
cmp += f[suf[e][i]];
if (cmp < f[e]) {
f[e] = cmp;
for (int i = ; i < (signed) pre[e].size(); i++) {
int eu = pre[e][i];
if (!vis[eu]) {
que.push(eu);
vis[eu] = true;
}
}
}
}
} inline void solve() {
spfa();
printf(Auto"\n", f[]);
} int main() {
init();
solve();
return ;
}

bzoj 3875 骑士游戏 - spfa - 动态规划的更多相关文章

  1. BZOJ 3875: [Ahoi2014]骑士游戏 spfa dp

    3875: [Ahoi2014]骑士游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3875 Description [故事背景] 长 ...

  2. 【BZOJ3875】【AHOI2014】骑士游戏 [Spfa][DP]

    骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 在这个游戏中,JYY一共有两种攻击 ...

  3. 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP

    [BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...

  4. bzoj3875 【Ahoi2014】骑士游戏 spfa处理后效性动规

    骑士游戏 [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JYY一共有两种攻 ...

  5. BZOJ3875 AHOI2014/JSOI2014骑士游戏(动态规划)

    容易想到设f[i]为杀死i号怪物所消耗的最小体力值,由后继节点更新.然而这显然是有后效性的,正常的dp没法做. 虽然spfa已经死了,但确实还是挺有意思的.只需要用spfa来更新dp值就可以了.dij ...

  6. LUOGU P4042 [AHOI2014/JSOI2014]骑士游戏 (spfa+dp)

    传送门 解题思路 首先设\(f[x]\)表示消灭\(x\)的最小花费,那么转移方程就是 \(f[x]=min(f[x],\sum f[son[x]] +s[x])\),如果这个转移是一个有向无环图,那 ...

  7. BZOJ 3875: [Ahoi2014]骑士游戏 dp+spfa

    题目链接: 题目 3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MB 问题描述 [故事背景] 长期的宅男生活中,JYY又挖掘出了一 ...

  8. BZOJ 3875: [Ahoi2014]骑士游戏

    d[i]表示消灭i所需的最小体力值, d[i] = min(S[i], K[i]+Σd[x]), Σd[x]表示普通攻击而产生的其他怪兽. 因为不是DAG, 所以用个队列类似SPFA来更新答案. -- ...

  9. [bzoj3875] [Ahoi2014]骑士游戏

    3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 844  Solved: 440[Submit][Status ...

随机推荐

  1. unity3d-游戏实战突出重围,整合游戏

    结构图: 两个场景,一个是开始界面.一个是游戏界面: 脚本说明:依次是:敌人脚本,主角游戏,主菜单,工具 Enemy using UnityEngine; using System.Collectio ...

  2. MySQL-UNIQUE

    什么是UNIQUE约束 可以使用 UNIQUE 约束确保在非主键列中不输入重复的值.尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制唯一性,但想要强制一列或多列组合(不是主键)的唯一性时 ...

  3. 关于windows中80端口被占用

    很奇怪,windows7系统中的80端口被pid 为4 的system进程监听. 尝试关闭IIS功能,并在这期间进行过多次重启,均无效. 后来依照这篇文件解决的:https://www.jianshu ...

  4. python中的IO操作

    python中的基本IO操作: 1) 键盘输入函数:raw_input(string),不作处理的显示,与返回. input(string),可以接受一个python表达式作为返回,python内部得 ...

  5. sitecore系统教程之体验编辑器

    体验编辑器是一个WYSIWYG编辑器,允许您直接在页面上轻松更改项目.您可以编辑页面上可见的所有项目 - 文本,图形,徽标,链接等. 在体验编辑器中,您可以编辑当前项目的字段以及页面上呈现的任何项目的 ...

  6. 【转】Loadrunner 性能指标定位系统瓶颈

    转至:http://www.51testing.com/html/63/n-1224463.html Loadrunner 性能指标定位系统瓶颈 判断CPU瓶颈 1, %processor time ...

  7. 向SQL Server中导入Excel的数据

    1.  手动界面导入Excel数据 同 https://jingyan.baidu.com/article/ce09321b9a0e252bff858ff9.html 首先打开并登陆sql serve ...

  8. css选择问题

    <div class="col-lg-4 col-md-6 mb-4"> <div class="card"> <a href=& ...

  9. unity3D客户端框架

    unity3D客户端框架  博客

  10. windows10 安装 mysql8.0.12 详解

    [1]下载安装包 官网下载地址:https://downloads.mysql.com/archives/community/ 如下图所示: 下载完成,安装包为mysql-8.0.12-winx64. ...