bzoj 3875 骑士游戏 - spfa - 动态规划
Description
Input
Output
输出一行一个整数,表示最少需要的体力值。
Sample Input
4 27 3 2 3 2
3 5 1 2
1 13 2 4 2
5 6 1 2
Sample Output
HINT
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 - 动态规划的更多相关文章
- BZOJ 3875: [Ahoi2014]骑士游戏 spfa dp
3875: [Ahoi2014]骑士游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3875 Description [故事背景] 长 ...
- 【BZOJ3875】【AHOI2014】骑士游戏 [Spfa][DP]
骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在这个游戏中,JYY一共有两种攻击 ...
- 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP
[BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...
- bzoj3875 【Ahoi2014】骑士游戏 spfa处理后效性动规
骑士游戏 [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JYY一共有两种攻 ...
- BZOJ3875 AHOI2014/JSOI2014骑士游戏(动态规划)
容易想到设f[i]为杀死i号怪物所消耗的最小体力值,由后继节点更新.然而这显然是有后效性的,正常的dp没法做. 虽然spfa已经死了,但确实还是挺有意思的.只需要用spfa来更新dp值就可以了.dij ...
- LUOGU P4042 [AHOI2014/JSOI2014]骑士游戏 (spfa+dp)
传送门 解题思路 首先设\(f[x]\)表示消灭\(x\)的最小花费,那么转移方程就是 \(f[x]=min(f[x],\sum f[son[x]] +s[x])\),如果这个转移是一个有向无环图,那 ...
- BZOJ 3875: [Ahoi2014]骑士游戏 dp+spfa
题目链接: 题目 3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MB 问题描述 [故事背景] 长期的宅男生活中,JYY又挖掘出了一 ...
- BZOJ 3875: [Ahoi2014]骑士游戏
d[i]表示消灭i所需的最小体力值, d[i] = min(S[i], K[i]+Σd[x]), Σd[x]表示普通攻击而产生的其他怪兽. 因为不是DAG, 所以用个队列类似SPFA来更新答案. -- ...
- [bzoj3875] [Ahoi2014]骑士游戏
3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 844 Solved: 440[Submit][Status ...
随机推荐
- django基础(一)
一.创建django程序 1.终端:django-admin startproject sitename 2.IDE创建Django程序时,本质上都是自动执行上述命令 常用命令: python man ...
- [提权] 脏牛漏洞 Dirty COW CVE-2016-5195 2.6.22 < 3.9 (x86/x64)
/* * (un)comment correct payload first (x86 or x64)! * * $ gcc cowroot.c -o cowroot -pthread * $ ./c ...
- (4)Python3笔记 之 流程控制
一.条件控制 # 语法规则 if 变量(或表达式): 语句块1 elif 变量(或表达式): 语句块2 else: 语句块3 #示例 score = 83 if score > 90: prin ...
- PLSQL oracle32位 oracle64 安装区别及注意问题
一.先明确几个概念: 1.PLSQL 只有32位的. 2.oracle 客户端 分别有32.64位,一般使用32位. 3.oracle 服务端 分别有32.64位,一般老的服务器使用32位,新的服务器 ...
- json为txt文本加密
我们知道json是一种数据传输的加密格式 这里为txt格式的文本加密(纯属无聊) 写的比较凌乱,查找你输入的两个文件夹下面的所有txt文件(包含下一级文件): 运行时要注意,别把重要文件给加密了 ...
- ClassThird
动手动脑: 1,在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 代码: public class Move_hands_Move_head { public void show( ...
- 20165215 2017-2018-2 《Java程序设计》第九周学习总结
20165215 2017-2018-2 <Java程序设计>第九周学习总结 教材学习内容总结 URL类 URL 类是 java.net 包中的一个重要的类,使用 URL 创建对象的应用程 ...
- 使用commons-compress解压GBK格式winzip文件到UTF8,以及错误使用ZipArchiveInputStream读出来数据全是空的解决办法
先上正确方法: 正确方式应该为,先创建一个ZipFile,然后对其entries做遍历,每一个entry其实就是一个文件或者文件夹,检测到文件夹的时候创建文件夹,其他情况创建文件,其中使用zipFil ...
- Linux基础命令---杀死进程pkill
pkill pkill可以给指定的进程发送信息,它可以结束某个执行的进程或者目录登录的用户. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedo ...
- [转载]时间显示插件 flipclock.js
<html> <head> <link rel="stylesheet" href="/assets/css/flipclock.css&q ...