骑士游戏

Time Limit: 30 Sec  Memory Limit: 256 MB
[Submit][Status][Discuss]

Description

  在这个游戏中,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

  2<=N<=2*10^5, 1<=Ri,Sigma(Ri)<=10^6, 1<=Ki,Si<=5*10^14

Solution

  首先,若是呈现树形结构,我们显然可以得到一个DP:f[i] = min(f[i], Σf[son[i]])f[i]表示消灭 i 最小花费)。

  但是,显然数据会出现有的情况。所以我们这个DP是有后效性的。

  那么我们就可以用Spfa来消除这个后效性,具体就是:若一个点的 f 在某处被更新了,那么把father[i]重新入队计算。

  (复杂度BearChild也不会算啊QAQ)

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
using namespace std;
typedef long long s64; const int ONE = ;
const int MOD = 1e9 + ; int n, x;
s64 f[ONE], unit[ONE]; int next[ONE], first[ONE], go[ONE], tot;
int nextop[ONE], firstop[ONE], goop[ONE], totop; queue <int> q; int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void Add(int u, int v)
{
next[++tot] = first[u], first[u] = tot, go[tot] = v;
nextop[++totop] = firstop[v], firstop[v] = totop, goop[totop] = u;
} void Spfa()
{
for(int i = ; i <= n; i++) q.push(i);
while(!q.empty())
{
int u = q.front(); q.pop(); s64 res = unit[u];
for(int e = first[u]; e; e = next[e])
res += f[go[e]]; if(res < f[u])
{
f[u] = res;
for(int e = firstop[u]; e; e = nextop[e])
q.push(goop[e]);
}
}
} int main()
{
n = get();
for(int i = ; i <= n; i++)
{
scanf("%lld %lld", &unit[i], &f[i]);
x = get();
while(x--) Add(i, get());
} Spfa(); printf("%lld", f[]);
}

【BZOJ3875】【AHOI2014】骑士游戏 [Spfa][DP]的更多相关文章

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

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

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

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

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

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

  4. [BZOJ3875][AHOI2014]骑士游戏(松弛操作)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3875 分析: 类似于spfa求最短路,设d[i]表示完全消灭i号怪物的最小花费,我们对 ...

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

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

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

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

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

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

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

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

  9. bzoj 3875: [Ahoi2014&Jsoi2014]骑士游戏【dp+spfa】

    设f[i]为杀死i的最小代价,显然\( f[i]=min(k[i],s[i]+\sum f[to]) \) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的 ...

随机推荐

  1. II 3.1 连接到服务器

    II 3.1 连接到服务器 package socket; import java.io.IOException; import java.io.InputStream; import java.ne ...

  2. 结对作业二——WordCount进阶版

    软工作业三 要求地址 作业要求地址 结对码云项目地址 结对伙伴:秦玉 博客地址 PSP表格 PSP2.1 个人开发流程 预估耗费时间(分钟) 实际耗费时间(分钟) Planning 计划 10 7 · ...

  3. [剑指Offer] 39.平衡二叉树

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. class Solution { public: int Get_Height(TreeNode* root) { if(root == NU ...

  4. C#下载网页

    System.Net.WebClient wc = new System.Net.WebClient(); Byte[] pageData = wc.DownloadData("网页地址&q ...

  5. context.getResourceAsStream获取的是部署在服务器上面的文件位置 而不是我们本地的工程位置 意思是说获取的都是web下面的文件位置

    context.getResourceAsStream获取的是部署在服务器上面的文件位置 而不是我们本地的工程位置 意思是说获取的都是web下面的文件位置

  6. BZOJ 1025 游戏(分组背包)

    题目所谓的序列长度实际上就是各循环节的lcm+1. 所以题目等价于求出 一串数之和等于n,这串数的lcm种数. 由唯一分解定理可以联想到只要把每个素数的幂次放在一个分组里,然后对整体做一遍分组背包就行 ...

  7. bzoj4753[JSOI2016]最佳团体

    题意:01分数规划,但可选的数字之间存在森林形的依赖关系(可以认为0号点是个虚根,因为并不能选). 虽然有森林形的依赖关系,但还是可以套分数规划的思路,二分答案k,判断是否存在一个比值大于k的方案 即 ...

  8. Give NetScaler a “Tune-Up”

    Give NetScaler a “Tune-Up” https://www.citrix.com/blogs/2014/10/21/give-netscaler-a-tune-up/ To Opti ...

  9. BZOJ1030:[JSOI2007]文本生成器——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1030 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件 ...

  10. 继续bzoj

    我应该可以打卡下班了,回来继续bzoj