SSL P1128 恶魔城
来源:互联网 发布:怎么查看数据库ip 编辑:程序博客网 时间:2024/05/29 04:43
题目大意:
恶魔城内有N个路口,有多个街道连接着任意2个路口,都是单向的(也就是说你不能逆着该街道指定的方向走),在城内无论怎么走都不可能走回原来走过的地方。初始时战士的HP为INITHP且在1号路口,撒旦则在第N号路口。街道上有魔鬼或者天使占领了。当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。如果某一时刻战士的HP<=0,那么他会死亡,给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。
整数N:3 ≤ N ≤ 100
A[i,j]为绝对值不超过10000的整数
题解:
这题其实,还是比较简单的:
我们先
对于一个f[i]表示从第i个路口走到第N个路口,保证过程全程HP>0的情况下,这个数最少是几。
因为街道是恶魔还是天使占领,已经通过a[i,j]的±给表示了,所以我们+a[i,j]就可以了,不用去判断。
然后我们将2个能互通的街道i,j,反向将j,i连边,表示到能到j到达的点i的权值a[j,i]。
然后我们倒着推跑spfa,初值f[n]=0
对于当前枚举到的点i,以及一个能到达这个点的点j,则f[i]可以影响f[j],因为对于一个点j,他到点i的值是f[j]*2+a[i,j]=f[i],所以我们逆着推,就可以判断当前的f[i]能否使f[j]更优。然后如果可以的话,则替换,然后将j加入队列里。
然后如果j点到i点,中间的a[i,j]>=f[i]的话,就代表j点的时候,只需要有HP就可以了,哪怕是1也可以,则赋值1,否则
f[j]=min(f[j],(f[i]-a[i,j]+1) div 2[+1])
注意如果a[i,j]是负数,
【(f[i]-a[i,j]+1) div 2】*2加上它后HP为0是不可以的,这时候还要+1。
var a:array [0..101,0..101] of longint; q:array [0..100001] of longint; f:array [0..101] of longint; v:array [0..101] of boolean; i,j,n,m:longint;procedure spfa;var head,tail,i,j:longint;begin for i:=1 to n do f[i]:=maxlongint div 3; head:=0; tail:=1; v[n]:=true; q[1]:=n; f[n]:=0; while head<tail do begin inc(head); for i:=1 to n do if a[q[head],i]<>0 then begin if a[q[head],i]>=f[q[head]]-1 then j:=1 else begin j:=(f[q[head]]-a[q[head],i]+1) div 2; if j*2=-a[q[head],i] then inc(j); end; if f[i]>j then begin f[i]:=j; if not(v[i]) then begin inc(tail); q[tail]:=i; v[i]:=true; end; end; end; v[q[head]]:=false; end;end;begin readln(n); for i:=1 to n do begin for j:=1 to n do read(a[j,i]); readln; end; spfa; writeln(f[1]);end.
- SSL P1128 恶魔城
- 恶魔城
- 恶魔城 acm
- vijos p1128 (选数)
- P1128 选数
- vijos-p1128 2008.11.6
- 洛谷 P1128 求正整数
- 南邮 OJ 1053 恶魔城
- [最短路] 恶魔城 (satanic)
- 8.16 恶魔城 1128
- 洛谷 P1128 [HNOI2001] 求正整数
- 洛谷 P1128 [HNOI2001]求正整数
- NOJ1053 恶魔城 dfs+二分求解
- 【记忆化】恶魔城(satanic.pas/c/cpp)
- NOJ1053恶魔城——DFS+二分查找
- 数学——洛谷P1128 [HNOI2001]求正整数
- SSL
- SSL
- Linux功耗管理(11)_Runtime PM之功能描述
- Python print格式化输出
- P3390 【模板】矩阵快速幂
- Mysiam和innodb的区别
- codeforces630Q 几何
- SSL P1128 恶魔城
- POJ
- FreeCodeCamp备查簿(3:#132-#160--JavaScript基础)
- 【Android笔记-1】
- NN 第二周大作业 代码
- win10的cmd如何更改consolas字体?
- 自动驾驶仿真_CAT Vehicle测试(1)——虚拟机上的ROS安装
- codeforces106E 模拟退火
- 2017.8.16. 拓展欧几里得