8.16 恶魔城 1128
来源:互联网 发布:淘宝店铺至尊会员 编辑:程序博客网 时间:2024/06/10 00:14
- 题目
- 题解
- 代码
题目
上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。开始的时候,战士的生命力(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,那么他会死亡。因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,所以上帝不希望让他的INITHP过高。
给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。
第一行有一个正整数N(3 ≤ N ≤ 100),下面跟着的第i行第j个数为A[i,j](绝对值不超过10000的整数)。
4 40 -4 0 –100 0 +3 00 0 0 –140 0 0 0
题解
传说中用Dfs就可以过,然而我已经打了那么长的二分+SPFA,懒得改了,于是就将就着用了。
确定最小的HP值(1)和最大的HP值(10000够了),二分答案,用SPFA判断答案,输出r
注意HP值可能累加得太大,应限制以避免运算上溢
看到吗,下面这个东西就是害我改了一晚上的罪魁祸首——清零!要不是我翻出以前的标对比,我永远也不会想到,我改了一个晚上就是因为清零!从此再也不会不清零。
b[v[h]]:=0;
代码
var n,i,j,k,t,mid,l,r:longint; x,y,ne,ls,w,d,b:array[0..10005]of longint; v:array[0..100005]of longint;function spfa(c:longint):boolean;var i,k,h,t:longint;begin fillchar(d,sizeof(d),0); fillchar(b,sizeof(b),0); h:=0;t:=1;v[1]:=1;d[1]:=c;b[1]:=1; while h<t do begin inc(h); k:=ls[v[h]]; while k>0 do begin if d[x[k]]*2+w[k]>d[y[k]] then begin if d[x[k]]*2+w[k]<10000000 then d[y[k]]:=d[x[k]]*2+w[k] else d[y[k]]:=10000000; if b[y[k]]=0 then begin b[y[k]]:=1; inc(t); v[t]:=y[k]; end; end; k:=ne[k]; end; b[v[h]]:=0; end; if d[n]>0 then exit(true) else exit(false);end;begin assign(input,'satanic.in7'); assign(output,'satanic.out'); reset(input);rewrite(output); readln(n); l:=1; for i:=1 to n do begin for j:=1 to n do begin read(k); if k<>0 then begin inc(t); x[t]:=i;y[t]:=j;w[t]:=k; ne[t]:=ls[x[t]]; ls[x[t]]:=t; end; end; end; r:=10000; while l<r do begin mid:=(l+r) div 2; if spfa(mid) then r:=mid else l:=mid+1; end; writeln(r); close(input);close(output);end.
- 8.16 恶魔城 1128
- 恶魔城
- 恶魔城 acm
- 南邮 OJ 1053 恶魔城
- [最短路] 恶魔城 (satanic)
- SSL P1128 恶魔城
- NOJ1053 恶魔城 dfs+二分求解
- 【记忆化】恶魔城(satanic.pas/c/cpp)
- NOJ1053恶魔城——DFS+二分查找
- 几道记忆化搜索专题(ackerman 滑雪 恶魔城)
- 8.16
- 8.16
- 8.16
- 8.16
- 8.16
- 1128
- 1128
- 1128
- C#中线程占用内存过大解决方法
- python反转字符串的几种方式
- C# 线程手册 第六章 线程调试与跟踪
- OI数学Note(基础篇)
- 【Linux】--系统vsftpd服务器安装配置(整理一)
- 8.16 恶魔城 1128
- 使用微信公众号链接进入discuz试提示"您访问的页面无手机页面" 二
- 那些复杂的列表总要弄个清楚——(三)激动人心的BaseAdapter之一
- zz-index属性
- Memory-Efficient Implementation of DenseNets
- 8.16 佳佳的魔法照片 1255
- 【正一专栏】保护孩子人人有责-评南京猥亵女童案
- 一些软件设计的原则
- border-image属性分析 [ 转载-学习 ]