[题解] 洛谷 P3393 逃离僵尸岛
很明显是一个最短路,但是如何建图才是关键。
对于每一个不可遍历到的点,可以向外扩散,找到危险城市。
若是对于每一个这样的城市进行搜索,时间复杂度就为\(O(n^2)\),显然过不了。不妨把它们放在一个BFS里面进行搜索,先遍历可以向外延伸最长的点,因为这个点是可以存活很长的。若之后再遍历到这个点的时候,就不用在遍历了,因为这时候的存活时间已经没有之前遍历的时候高了。BFS+打标记遍历完一张图只需要\(O(n)\)的时间复杂度,很大程度上优化了建图方面。
最后根据所给的边跑一遍最短路即可,代码如下:
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
void Quick_Read(LL &N) {
N = 0;
char c = getchar();
LL op = 1;
while(c < '0' || c > '9') {
if(c == '-')
op = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
N = (N << 1) + (N << 3) + c - 48;
c = getchar();
}
N *= op;
}
const LL MAXN = 1e6 + 5;
struct Node {
LL to, dist;
Node() {}
Node(LL T, LL D) {
to = T;
dist = D;
}
friend bool operator > (Node x, Node y) {
return x.dist > y.dist;
}
};
struct Flee {
LL step, id;
Flee() {}
Flee(LL I, LL S) {
step = S;
id = I;
}
friend bool operator > (Flee x, Flee y) {
return x.step < y.step;
}
};
vector<LL> v[MAXN];
vector<Node> wg[MAXN];
queue<Flee> que;
priority_queue<Node, vector<Node>, greater<Node> > qu;
bool f[MAXN], vis[MAXN], vi[MAXN], V[MAXN];
LL c[MAXN], w[MAXN];
LL A[MAXN], B[MAXN], d[MAXN];
LL n, m, k, s, p, q;
void Dijkstra() {
memset(d, 0x3f, sizeof(d));
qu.push(Node(1, 0));
d[1] = 0;
while(!qu.empty()) {
LL now = qu.top().to; qu.pop();
if(V[now])
continue;
V[now] = true;
LL SIZ = wg[now].size();
for(LL i = 0; i < SIZ; i++) {
LL next = wg[now][i].to;
if(d[now] + wg[now][i].dist < d[next]) {
d[next] = d[now] + wg[now][i].dist;
qu.push(Node(next, d[next]));
}
}
}
printf("%lld", d[n]);
}
void bfs() {
for(LL i = 1; i <= k; i++) {
que.push(Flee(c[i], s));
vi[c[i]] = 1;
}
while(!que.empty()) {
Flee now = que.front(); que.pop();
if(vis[now.id])
continue;
vis[now.id] = 1;
vi[now.id] = 1;
if(now.step == 0)
continue;
LL SIZ = v[now.id].size();
for(LL i = 0; i < SIZ; i++) {
LL nex = v[now.id][i];
que.push(Flee(nex, now.step - 1));
}
}
}
void Read() {
Quick_Read(n);
Quick_Read(m);
Quick_Read(k);
Quick_Read(s);
Quick_Read(p);
Quick_Read(q);
for(LL i = 1; i <= k; i++) {
Quick_Read(c[i]);
f[c[i]] = true;
}
for(LL i = 1; i <= m; i++) {
Quick_Read(A[i]);
Quick_Read(B[i]);
v[A[i]].push_back(B[i]);
v[B[i]].push_back(A[i]);
}
}
void Build() {
for(LL i = 1; i <= n; i++)
w[i] = p;
for(LL i = 1; i <= n; i++)
if(vi[i])
w[i] = q;
for(LL i = 1; i <= k; i++)
w[c[i]] = INF;
for(LL i = 1; i <= m; i++) {
if(B[i] == n) {
wg[A[i]].push_back(Node(B[i], 0));
wg[B[i]].push_back(Node(A[i], w[A[i]]));
}
else if(A[i] == n) {
wg[A[i]].push_back(Node(B[i], w[B[i]]));
wg[B[i]].push_back(Node(A[i], 0));
}
else {
wg[A[i]].push_back(Node(B[i], w[B[i]]));
wg[B[i]].push_back(Node(A[i], w[A[i]]));
}
}
}
int main() {
Read();
bfs();
Build();
Dijkstra();
return 0;
}
[题解] 洛谷 P3393 逃离僵尸岛的更多相关文章
- 洛谷 P3393 逃离僵尸岛
洛谷 这道题目其实是最短路裸题. 首先看到题目,要求的到"被占点"距离不大于S的点,自然想到了以"被占点"为源点,求一遍最短路,处理出"危险点&quo ...
- 洛谷P3393 逃离僵尸岛
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- 洛谷P3393逃离僵尸岛 最短路
貌似一直不写题解不太好QAQ 但是找不到题啊... 随便写点水题来补博客吧 题目不pa了,点链接吧... 点我看题 很明显这是道sb题... 思路: 对于每一个僵尸城市预处理其 s 距离内的城市,然 ...
- P3393 逃离僵尸岛
P3393 逃离僵尸岛 啊.好久不写dij手都生了 这道题就是预先处理出是否是危险城市,然后跑一个最短路就行了 然后因为我感觉这个对时间要求不大紧.判断危险城市时就写了个电风扇(DFS) 然后T飞了呜 ...
- luogu P3393 逃离僵尸岛-搜索剪枝+spfa
P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...
- luogu P3393 逃离僵尸岛
luoguP3393逃离_僵尸岛_ 一道洛谷不知道哪门子月赛的题 可以用此题来练习最短路算法 SPFA和dijkstra的练习题(关于Floyed,他死了 思路: 本题是最短路板子. 首先就是建立虚点 ...
- 洛谷⑨月月赛Round2 P3393逃离僵尸岛[最短路]
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- 【luogu P3393 逃离僵尸岛】 题解
题目链接:https://www.luogu.org/problemnew/show/P3393 被占领的点可以先连在一个点上然后只需要对这一个点bfs一遍就可以求所有的危险点 #include &l ...
- Luogu P3393 逃离僵尸岛【最短路】By cellur925
题目传送门 题目大意:(其实概括出来也就基本做完了hh)在一张有$n$个点,$m$条边的无向图上,有$k$个点是不能经过的,而与之距离不超过$s$的点,到他们会花费$Q$元,到其他点会花费$p$元,求 ...
随机推荐
- Java学习的第五十一天
1.例9.3 析构函数 public class Cjava { public static void main(String[]args) { Student s1=new Student(1001 ...
- 如果在Yii中,使用AR查询,不直接写sql,则在使用的时候会报错
如果在Yii中,使用AR查询,不直接写sql,则在使用的时候会报错 Student::find() ->select("id,name,from_unixtime(create_tim ...
- 给萌新HTML5 入门指南(二)
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们已经为大家介绍了HTML5新增的内容和基础页面布局,这篇会继续向大 ...
- Positions of Large Groups
Positions of Large Groups In a string S of lowercase letters, these letters form consecutive groups ...
- EntityFramework Core上下文实例池原理分析
前言 无论是在我个人博客还是著作中,对于上下文实例池都只是通过大量文字描述来讲解其基本原理,而且也是浅尝辄止,导致我们对其认识仍是一知半解,本文我们摆源码,从源头开始分析.希望通过本文从源码的分析,我 ...
- 4 urllib和urllib2的区别
4 urllib和urllib2的区别 这个面试官确实问过,当时答的urllib2可以Post而urllib不可以. urllib提供urlencode方法用来GET查询字符串的产生,而urllib2 ...
- php支付宝签名验证类
<?php /* * 黎明互联 * https://www.liminghulian.com/ */ class RSA { /** * RSA签名 * @param $data 待签名数据 * ...
- JS模拟百度分享侧边栏效果
模拟百度分享侧边栏的弹出与滑入效果.当鼠标移入#div1分享侧边栏,#div1分享侧边栏区块匀速滑出直至其全部露出.当鼠标移除#div1分享侧边栏,#div1分享侧边栏区块匀速滑入隐藏,直至恢复初始位 ...
- C# + Matlab 实现计件工时基于三层BP神经网络的拟合--真实项目
工序工时由该工序的工艺参数决定,有了工时后乘以固定因子就是计件工资.一般参考本地小时工资以及同类小时工资并考虑作业的风险等因素给出固定因子 采用的VS2010 , Matlab2015a 64, 开 ...
- Gromacs命令-Chapter1
Gromacs的命令非常多,下面我将我最近用到的先总结一下.标题上也写了这只是Chapter1,以后有新的会继续写Chapter2...等等. 下面这个网址http://manual.gromacs. ...