热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【题解】LuoGu3393:逃离僵尸岛

原题传送门题目描述小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家。该国有N个城市,城市之间有道路相连。一共有M条双向道路。保

原题传送门
题目描述

小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&#xff0c;把遍历到的距离<&#61;s的标记为危险城市&#xff08;危险城市与感染城市是不同的&#xff09;
  • 以1为起点&#xff0c;做最短路&#xff0c;我刚学了dijkstra堆优化&#xff0c;所以用了这个方法&#xff0c;本题也可以用SPFA

嗯没错&#xff0c;这就是一道模板题&#xff0c;解释一下我的代码的各个变量的用途


  • heap 堆&#xff08;由于我用的是pascal&#xff0c;所以是手打堆&#xff09;
  • q,d 用于bfs&#xff0c;q记录点的序号&#xff0c;d记录该点离最近的感染城市的距离
  • edge,head 数组模拟链表存图
  • flag 标记感染城市 danger 标记危险城市 vis 用于dijkstra
  • dis 表示距离&#xff0c;用于dijkstra

注意&#xff1a;开int64(long long)&#xff0c;并且初始化dis也要弄得很大很大&#xff0c;比2147483647还要大

Code&#xff1a;

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 :&#61; y;edge[num].next :&#61; head[x];head[x] :&#61; num;
end;procedure swap(var x,y:int64);
vartmp:int64;begintmp :&#61; x; x :&#61; y; y :&#61; tmp;
end;procedure push(x,y:int64);
vari:longint;begininc(len);heap[len].num :&#61; x; heap[len].dis :&#61; y;i :&#61; len;while i > 1 dobeginif heap[i].dis > 1].dis thenbeginswap(heap[i].num,heap[i >> 1].num);swap(heap[i].dis,heap[i >> 1].dis);i :&#61; i >> 1;end else break;end;
end;procedure pop;
vari,x:longint;beginheap[1].num :&#61; heap[len].num; heap[1].dis :&#61; heap[len].dis;dec(len); i :&#61; 1;while (i <<1) <&#61; len dobeginif ((i <<1 or 1) > len) or (heap[i <<1].dis 1 or 1].dis) thenx :&#61; i <<1 else x :&#61; 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 :&#61; x;end else break;end;
end;beginreadln(n,m,k,s);readln(p,qq);for i :&#61; 1 to k dobeginreadln(q[i]);flag[q[i]] :&#61; true;end;for i :&#61; 1 to m dobeginreadln(x,y);add(x,y); add(y,x);end;t :&#61; k;while h dobegininc(h);if d[h] &#61; s then break;i :&#61; head[q[h]];while i <> 0 dobegine :&#61; edge[i].t;if not danger[e] thenbegindanger[e] :&#61; true;inc(t);q[t] :&#61; e; d[t] :&#61; d[h] &#43; 1;end;i :&#61; edge[i].next;end;end;for i :&#61; 2 to n do dis[i] :&#61; maxlongint * maxlongint;heap[1].num :&#61; 1; heap[1].dis :&#61; 0; len :&#61; 1;while len > 0 dobeginx :&#61; heap[1].num; y :&#61; heap[1].dis;pop;if vis[x] then continue;vis[x] :&#61; true;i :&#61; head[x];while i <> 0 dobegine :&#61; edge[i].t;if flag[e] thenbegini :&#61; edge[i].next;continue;end;if danger[e] then w :&#61; qq else w :&#61; p;if e &#61; n then w :&#61; 0;if dis[e] > y &#43; w thenbegindis[e] :&#61; y &#43; w;push(e,dis[e]);end;i :&#61; edge[i].next;end;end;writeln(dis[n]);
end.

推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • 本文讨论了B360主板是否可以安装win7系统的问题。由于B360主板不支持win7系统且缺乏官方驱动的支持,安装win7系统可能存在兼容性和稳定性问题。然而,通过借助USB3.0转接卡,B360主板仍然可以安装win7系统,但USB接口无法使用。相比之下,B365主板可以直接支持win7系统,并提供了相应的驱动,具有更好的稳定性和兼容性。选择合适的主板对于安装win7系统至关重要。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 本文介绍了如何通过维持两个堆来获取一个数据流中的中位数。通过使用最大堆和最小堆,分别保存数据流中较小的一半和较大的一半数值,可以保证两个堆的大小差距为1或0。如果数据流中的数量为奇数,则中位数为较大堆的最大值;如果数量为偶数,则中位数为较大堆的最大值和较小堆的最小值的平均值。可以使用优先队列来实现堆的功能。本文还提供了相应的Java代码实现。 ... [详细]
author-avatar
dajiang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有