博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
骑士游戏
阅读量:5462 次
发布时间:2019-06-15

本文共 1324 字,大约阅读时间需要 4 分钟。

我们定义dis[i]代表完全杀死i号怪兽的最小体力值花费,那么初始值都是法术攻击的花费。

那么动态转移方程就是:dis[i]=min(magic[i],common[i]+∑son:(dis[i]))

但是我们会发现直接搞dp的话是有后效性的,比如:1-->2-->1那么就会陷入死循环

但是我们惊奇的发现这个好像和SPFA的松弛操作有一些相像,所以我们改变思路,跑一遍SPFA

由于从起点开始跑等于直接比较儿子节点的魔法费用,显然是错误的,所以将所有点全部压入队列中进行考虑

并且如果一个节点的儿子节点被考虑过之后,父节点也会受影响,所以也要重新决策一次

时间复杂度可以看作是SPFA的复杂度上加一个小常数,具体不会证,注意常数优化

最后,附上本题代码:(自动省略头文件)

1 il LL read() 2 { 3     reg LL w=0; 4     char ch=getchar(); 5     while(ch<'0'||ch>'9') ch=getchar(); 6     while(ch>='0'&&ch<='9')  7     { 8         w=(w<<3)+(w<<1)+ch-'0'; 9         ch=getchar();10     }11     return w;12 }13 struct EDGE14 {15     int to,nxt;16 };17 EDGE edge[maxm+5],rev[maxm + 5];18 int n,cnt;19 LL dis[maxn+5],c[maxn+5];20 int head[maxn+5];21 bool vis[maxn+5];22 queue
q;23 24 il void add(int x,int y)25 {26 edge[++cnt].to=y;27 edge[cnt].nxt=head[x];28 head[x]=cnt;29 }30 int fir[maxn + 5],alloc;31 il void addrev(int u,int v)32 {33 rev[++alloc].nxt = fir[u];34 fir[u] = alloc;35 rev[alloc].to = v;36 }37 il void SPFA()38 {39 UF(i,1,n) q.push(i),vis[i]=1;40 while(!q.empty())41 {42 reg int s=q.front();43 reg LL res=c[s];44 vis[s]=0,q.pop();45 for(reg int i=head[s]; i; i=edge[i].nxt) res+=dis[edge[i].to];46 if(res

 

转载于:https://www.cnblogs.com/yufenglin/p/10885407.html

你可能感兴趣的文章
ArcGIS Server 10.1 错误 service failed to start,
查看>>
MYSQL中case when then else end 用法
查看>>
C语言::模拟实现strlen函数
查看>>
利用NABCD模型进行竞争性需求分析
查看>>
Vue的ref,父节点,获取子节点数据的一个手段
查看>>
好文推荐系列--------(1)bower---管理你的客户端依赖
查看>>
一些常用的基本知识收录
查看>>
1044 火星数字
查看>>
数据劫持,订阅者模式,双向绑定
查看>>
关于使用别人方法的效率问题
查看>>
svn第一篇----入门指南
查看>>
按钮 是否可用 的控制
查看>>
隐马尔科夫模型(HMM) 举例讲解
查看>>
JedisUtils工具类模板
查看>>
NOIP2011题解
查看>>
[Python] 文科生零基础学编程系列二——数据类型、变量、常量的基础概念
查看>>
[唐胡璐]QTP技巧 - ALT+G快捷键
查看>>
P2746 [USACO5.3]校园网Network of Schools
查看>>
java中使用队列:java.util.Queue
查看>>
随笔记录(2019.7.16)
查看>>