题目

题目描述
一万两千年前,当精灵还是在艾萨拉女王的统治下的时候,辛德拉就是是女王手下一名很有地位的法师了。他受任建造了一座城市,来保存女王的法师们进行魔法研究的成果和法术物品。这个城市就是埃雷萨拉斯。永恒之井爆炸以后,埃雷萨拉斯的精灵和艾萨拉联系中断,并失去了永恒之井的水做为能量的来源。辛德拉的后人为了对满足魔法的欲望,他们捕猎了一个恶魔,伊莫塔尔。他们用水晶塔建造了一个带有能量平衡系统的结界监狱,水晶塔从恶魔身上吸取能量,一部分维持结界监狱,一部分可以让狂热的精灵们吸收。这个系统万年以来一直平安无事,可是现在,随着恶魔的能量被消耗殆尽,已经难以维持结界监狱的消耗。统治者托尔塞林王子为了满足自己的欲望,开始下令屠杀,除了少数狂热者之外的其他人都要死,这样才能减少对魔法能量的消耗。终于有一天,戈多克食人魔成功入侵了埃雷萨拉斯,并杀死了几乎所有的精灵。他们把这里当作自己王国的领地,名叫厄运之槌。面临着灭顶之灾的精灵们把他们祖先留下的宝藏用魔法结界藏了起来,以防戈多克食人魔抢走。

作为一名勇敢的探险者,你悄悄来到了埃雷萨拉斯寻找传说中的宝藏。终于,你看见宝藏就在你的前方不远处。但是你不能贸然前进,因为路上有着强大的魔法结界。这些结界根据能量的不同分为P种,踏入每种结界,你都会受到一定的伤害。为了拿到宝藏,这些伤害算不了什么。但是你要尽可能地减少伤害,请你设计一条路线,使你穿越结界获取宝藏受到的伤害最少。下面是一个魔法结界能量示意图,结界是一个正方形,内部有P种不同的能量,每种字母表示一种能量。你从最上端开始走,每次可以走到与你所在的位置上下左右相邻的临位,或者在同种能量结界中任意传送。重复进入同一种能量结界不会再次受到伤害。

|AAABBC|
|ABCCCC|
|AABBDD|
|EEEEEF|
|EGGEFF|
|GGFFFF|

你有H点生命值,请你在贸然行动之前先判断是否能够活着(生命值大于0)穿越结界拿到宝藏,如果能够,请求出最多剩余的生命值。

输入
第1行 三个非负整数 N,P,H。N为结界的边长,P为不同的能量结界的数量,H为你的生命值。
第2-P+1行 每行一个非负整数,表示走到该种能量结界受到的伤害值。
第P+2至第P+2+N行 每行N个正整数,为地图上该单元格的能量种类的编号,编号为1…P。
输出
如果你能够穿越结界到达对岸的宝藏,输出最多剩余的生命值。如果不能穿越,输出NO。


解题思路

很容易想到对于相同的能量结界连一条权值为零的边,不相同的话就连一条权值为被连边点权的边,然后像最大流那样建一个超级源点和汇点就可以了。

注意:1.范围 2.最后判断条件时需要注意生命值不能为零


代码

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define rep(i,x,y) for(register int i=x;i<=y;++i)
using namespace std;
int n,p,h,tot,head[4001],g[4001],t[201][201],f[4001],T,sa[4]={0,1,0,-1},sb[4]={1,0,-1,0}; bool b[4001];
queue<int> q;
struct node{int y,z,next;}a[8000001];
void add(int x,int y,int z){a[++tot]=(node){y,z,head[x]}; head[x]=tot;}
int main(){scanf("%d%d%d",&n,&p,&h); T=n*n+1; rep(i,1,p) scanf("%d",&g[i]); rep(i,1,n) rep(j,1,n) scanf("%d",&t[i][j]); rep(i,1,n) rep(j,1,n) rep(k,0,3)if (t[i+sa[k]][j+sb[k]]!=t[i][j]&&i+sa[k]<=n&&i+sa[k]>0&&j+sb[k]<=n&&j+sb[k]>0) add(i*n-n+j,(i+sa[k]-1)*n+j+sb[k],g[t[i+sa[k]][j+sb[k]]]),add((i+sa[k]-1)*n+j+sb[k],i*n-n+j,g[t[i][j]]); rep(i,1,n) rep(j,1,n) rep(ii,1,n) rep(jj,1,n) if (t[i][j]==t[ii][jj]) add(i*n-n+j,ii*n-n+jj,0),add(ii*n-n+jj,i*n-n+j,0);rep(i,1,n) add(0,i,g[t[1][i]]); rep(i,1,n) add(n*n-n+i,T,0); rep(i,0,T+2) f[i]=0x3f3f3f3f; f[0]=0; q.push(0); b[0]=1; while(!q.empty()){int x=q.front(); q.pop(); b[x]=0; for (int i=head[x];i;i=a[i].next){int y=a[i].y; if (f[y]>f[x]+a[i].z) {f[y]=f[x]+a[i].z; if (!b[y]) {q.push(y);b[y]=1;}}}}if (f[T]>=h) printf("NO"); else printf("%d",h-f[T]);
}

[nssl 1319] 埃雷萨拉斯寻宝 {spfa}相关推荐

  1. SSLOJ 1319.埃雷萨拉斯寻宝

    题目 题目描述 一万两千年前,当精灵还是在艾萨拉女王的统治下的时候,辛德拉就是是女王手下一名很有地位的法师了.他受任建造了一座城市,来保存女王的法师们进行魔法研究的成果和法术物品.这个城市就是埃雷萨拉 ...

  2. 【最短路】埃雷萨拉斯寻宝(eldrethalas) 解题报告

    问题来源 BYVoid魔兽世界模拟赛 [问题描述] 一万两千年前,当精灵还是在艾萨拉女王的统治下的时候,辛德拉就是是女王手下一名很有地位的法师了.他受任建造了一座城市,来保存女王的法师们进行魔法研究的 ...

  3. 欢乐SSL初二组周六赛【2019.4.27】

    前言 AK???AK???AK??? 成绩 只放前101010,然后T3T3T3数据锅了一会 RankRankRank PersonPersonPerson ScoreScoreScore AAA B ...

  4. nssl1319-埃雷萨拉斯寻宝【SPFA,建图】

    正题 题目大意 从第一列出发,到最后一列,然后可以传送到相同的魔法格里,经过不同的魔法格会损伤不同的生命(如果之前经过过就不会).求最大剩余生命. 解题思路 因为相同的魔法格可以传送,所以你肯定不会回 ...

  5. 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  6. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  7. spfa(还不懂--)

    粗略讲讲SPFA算法的原理,SPFA算法是1994年西安交通大学段凡丁提出 是一种求单源最短路的算法 算法中需要用到的主要变量 int n;  //表示n个点,从1到n标号 int s,t;  //s ...

  8. sdut AOE网上的关键路径(spfa+前向星)

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2498&cid=1304 题目描述 一个无环的有向图称为无环图(Directed Acyc ...

  9. poj 3662 Telephone Lines spfa算法灵活运用

    意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...

最新文章

  1. 【系统分析与设计】UML类图绘制方法(真の能看懂~!)
  2. 12c分页查询特性FETCH FIRST ROWS,OFFSET ROWS FETCH NEXT ROW LIMIT Clause子句
  3. oracle sql loop merge,Oracle之存储过程和MERGE INTO语句
  4. Linux 实现rsyslog日志里面的IP地址记录 未测试
  5. Python常用的字符串操作
  6. STM32F103C8在应用编程(IAP)介绍及实现
  7. MAXScript入门
  8. 干货收藏!如何绘制产品流程图
  9. mybatis-plus使用和原理剖析之逻辑删除
  10. 蓝牙sbc怎么解决_你不知道蓝牙耳机术语,看懂了才明白哪些是优质蓝牙耳机
  11. 腾讯实习生腾讯云后台一面面经
  12. 计算机运行黑屏显示器正常,电脑主机运行正常显示器黑屏怎么办
  13. Ubuntu 16.10 解决 DNS 解析失败
  14. html未响应是什么原因,ie浏览器未响应如何解决
  15. manjaro 亮度调节
  16. Excel中ROUND、ROUNDUP、ROUNDDOWN函数详解
  17. C语言程序设计教程的读后感,c语言程序设计观后感
  18. win10打开telnet客户端
  19. Java8 ConcurrentLinkedQueue和LinkedTransferQueue 源码解析
  20. 史上最简单-在 windows+python3.6 环境下创建自己的YOLOv3 [ VOC2007 ] 数据集

热门文章

  1. fckedit详细使用说明
  2. ElasticSearch的IK中文分词器
  3. 我要每人送一块高端鼠标垫,包邮…
  4. MediaCodec解码h264流
  5. TCP/IP(八)之总结TCP/IP四层模型
  6. unity使用百度AI实现人脸融合
  7. android studio 一直refreshing,AndroidStudio更新出现Refreshing 'xxx' Gradle Project状态解决办法...
  8. Oracle创建用户、表空间
  9. 未来二维码发展趋势:从“吃穿住行”到“生死救援”的华丽转身
  10. 如何安装WIN11安卓子系统并进行侧载apk详细说明