【题解】LuoGu3393:逃离僵尸岛
原题传送门
题目描述
小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家。
该国有N个城市,城市之间有道路相连。一共有M条双向道路。保证没有自环和重边。
K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT…所以不能进入。由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市。换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险。
小a住在1号城市,国际空港在N号城市,这两座城市没有被侵略。小a走每一段道路(从一个城市直接到达另外一个城市)得花一整个白天,所以晚上要住旅店。安全的的城市旅馆比较便宜要P元,而被危险的城市,旅馆要进行安保措施,所以会变贵,为Q元。所有危险的城市的住宿价格一样,安全的城市也是。在1号城市和N城市,不需要住店。
小a比较抠门,所以他希望知道从1号城市到N号城市所需要的最小花费。
输入数据保证存在路径,可以成功逃离。输入数据保证他可以逃离成功。
输入输出格式
输入格式:
第一行4个整数(N,M,K,S)
第二行2个整数(P,Q)
接下来K行,ci,表示僵尸侵占的城市
接下来M行,ai,bi,表示一条无向边
输出格式:
一个整数表示最低花费
输入样例
13 21 1 1
1000 6000
7
1 2
3 7
2 4
5 8
8 9
2 5
3 4
4 7
9 10
10 11
5 9
7 12
3 6
4 5
1 3
11 12
6 7
8 11
6 13
7 8
12 13
输出样例
11000
对于100%数据,2 ≦ N ≦ 100000, 1 ≦ M ≦ 200000, 0 ≦ K ≦ N - 2, 0 ≦ S ≦ 100000
【题解】
读完题目我发现这是一道裸的最短路~~~
只是多了一个判断是否为危险城市的步骤
本题分为以下几个步骤
- 把感染的城市标记,这些城市是不通的,并放进一个bfs队列
- 从感染的城市出发进行bfs,把遍历到的距离<=s的标记为危险城市(危险城市与感染城市是不同的)
- 以1为起点,做最短路,我刚学了dijkstra堆优化,所以用了这个方法,本题也可以用SPFA
嗯没错,这就是一道模板题,解释一下我的代码的各个变量的用途
- heap 堆(由于我用的是pascal,所以是手打堆)
- q,d 用于bfs,q记录点的序号,d记录该点离最近的感染城市的距离
- edge,head 数组模拟链表存图
- flag 标记感染城市 danger 标记危险城市 vis 用于dijkstra
- dis 表示距离,用于dijkstra
注意:开int64(long long),并且初始化dis也要弄得很大很大,比2147483647还要大
Code:
varheap:array[0..1000000] of recordnum,dis:int64;end;edge:array[0..1000000] of recordt,next:int64;end;head,q,d,dis:array[0..1000000] of int64;vis,danger,flag:array[0..1000000] of boolean;n,m,k,s,p,qq,x,y,z,h,t,num,len,e,w:int64;i:longint;procedure add(x,y:int64);begininc(num);edge[num].t := y;edge[num].next := head[x];head[x] := num;
end;procedure swap(var x,y:int64);
vartmp:int64;begintmp := x; x := y; y := tmp;
end;procedure push(x,y:int64);
vari:longint;begininc(len);heap[len].num := x; heap[len].dis := y;i := len;while i > 1 dobeginif heap[i].dis < heap[i >> 1].dis thenbeginswap(heap[i].num,heap[i >> 1].num);swap(heap[i].dis,heap[i >> 1].dis);i := i >> 1;end else break;end;
end;procedure pop;
vari,x:longint;beginheap[1].num := heap[len].num; heap[1].dis := heap[len].dis;dec(len); i := 1;while (i << 1) <= len dobeginif ((i << 1 or 1) > len) or (heap[i << 1].dis < heap[i << 1 or 1].dis) thenx := i << 1 else x := i << 1 or 1;if heap[i].dis > heap[x].dis thenbeginswap(heap[i].num,heap[x].num);swap(heap[i].dis,heap[x].dis);i := x;end else break;end;
end;beginreadln(n,m,k,s);readln(p,qq);for i := 1 to k dobeginreadln(q[i]);flag[q[i]] := true;end;for i := 1 to m dobeginreadln(x,y);add(x,y); add(y,x);end;t := k;while h < t dobegininc(h);if d[h] = s then break;i := head[q[h]];while i <> 0 dobegine := edge[i].t;if not danger[e] thenbegindanger[e] := true;inc(t);q[t] := e; d[t] := d[h] + 1;end;i := edge[i].next;end;end;for i := 2 to n do dis[i] := maxlongint * maxlongint;heap[1].num := 1; heap[1].dis := 0; len := 1;while len > 0 dobeginx := heap[1].num; y := heap[1].dis;pop;if vis[x] then continue;vis[x] := true;i := head[x];while i <> 0 dobegine := edge[i].t;if flag[e] thenbegini := edge[i].next;continue;end;if danger[e] then w := qq else w := p;if e = n then w := 0;if dis[e] > y + w thenbegindis[e] := y + w;push(e,dis[e]);end;i := edge[i].next;end;end;writeln(dis[n]);
end.
【题解】LuoGu3393:逃离僵尸岛相关推荐
- [luogu3393]逃离僵尸岛
[luogu3393]逃离僵尸岛 luogu 先把被禁止的点和新建的虚点n+1连0边 跑最短路,dis<=s的点价格为Q,否则为P, 再建图跑最短路 #define ll long long # ...
- luogu P3393 逃离僵尸岛(点权最短路 + 多源BFS)
P3393 逃离僵尸岛 最短路,有点的不能到达我们就直接把他的权值赋值为INF即可. bfs预处理一下每个点的危险程度. 因为这里没有边权是点权,我们可以把边权转化为两端点的权值和,或者直接跑点权最短 ...
- 洛谷 P3393 逃离僵尸岛 ( spfa+dfs) 题解
题目来源: https://www.luogu.org/problemnew/show/P3393 题目描述: 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国 ...
- 【luogu P3393 逃离僵尸岛】 题解
题目链接:https://www.luogu.org/problemnew/show/P3393 被占领的点可以先连在一个点上然后只需要对这一个点bfs一遍就可以求所有的危险点 #include &l ...
- luoguP3393逃离僵尸岛
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- 逃离僵尸岛【最短路】
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- luogu 3393 逃离僵尸岛
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- 洛谷3393 逃离僵尸岛
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- [单源最短路]逃离僵尸岛
(捂脸)随便点了道题写 突然发现是道水题 立马AAAA掉了 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路. ...
最新文章
- Java Web中的jsp技术
- cigarettes(香烟)
- python中实现sigmiod功能
- 2、深入理解 Laravel Eloquent(二)——中间操作流(Builder)
- linux下的PDF阅读器
- React小书中得CommentList的需求实现
- 有限元分析类毕业论文文献(推荐10篇)
- docker基础篇--有它就够了
- 基于JavaEE的健身器材产品专卖店管理系统_JSP网站设计_MySQL数据库设计
- Formality形式验证教程
- 农业物联网智能灌溉的功能特点
- 如何判断是否受到DDOS攻击?被攻击该如何解决?
- 实验吧-隐写-欢迎来到地狱(Word文档文字隐藏、Rabbit加密)
- Dynamics 365 安装Report Authoring Extension时,提示重新启动的问题
- sublime批量处理excel数据
- Sqlserver alter增加列后列名无效
- 推广引流方法有哪些?
- 【pygame游戏开发】这几个经典游戏,勾起了少年的快乐
- xy苹果助手未受信任_2020新春精品——S级性价比:苹果/安卓/电脑统一适配音乐神器...
- Google Play services for Android下载:失败,华为系统限定死了,上网找了几种方法全部失败
热门文章
- Keil 更新 J-Link DLL
- php:一次完整的HTTP请求过程笔记
- fopen()函数的使用方法
- GEE开发之MODIS_MCD12Q1数据分析和获取
- linux 像素飞机大战 命令行
- vue如何解决axios请求前端跨域问题
- 使用MyBatis in查询(单次查询)和for循环查询(多次查询) 的效率问题
- ppt如何旋转流程图_几种流程图详解.ppt
- C语言函数返回值与参数传递
- 基于docker部署前后端分离项目--->docker+Dockerfile+vue+nginx+uwsgi+django+socket+负载均衡