[题解] 洛谷 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$元,求 ...
随机推荐
- 面试官:看你简历说写精通ThreadLocal,这几道题你都会吗?
问题 和Synchronized的区别 存储在jvm的哪个区域 真的只是当前线程可见吗 会导致内存泄漏么 为什么用Entry数组而不是Entry对象 你学习的开源框架哪些用到了ThreadLocal ...
- 微信小程序--基于ColorUI构建皮皮虾短视频去水印组件(仅供学习使用)
微信小程序--基于ColorUI构建皮皮虾短视频去水印组件(仅供学习使用) 没错,我是皮友,我想学习舞蹈(/doge)和瑜伽 ,要无水印的那种有助于我加深学习. 1.组件效果展示 2.组件引入准备 h ...
- Jmeter 用户定义的变量的使用
第一步: 打开Jmeter软件,新建一个线程组,添加 > 配置元素 > 用户定义的变量 第二步: 设置值,如下图所示: 第三步,使用设置的名称 :
- 小白如何学习PyTorch】25 Keras的API详解(下)缓存激活,内存输出,并发解决
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑答疑解惑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx6450 ...
- 没有磁盘空间 No space left on device
INSTALL 的解释文件 帮助文件 这里的 pytorch=1.0.1 torchvision=0.2.2 cudatoolkit=9.0,这个ATSS可以运行. 这里最好能够查看一下cuda的版本 ...
- 鸿蒙之后,小米 Vela 也来了,下一代物联网平台应该是什么?
1. 华为鸿蒙基于jerryscript构建物联网应用框架 2020年9月10日 鸿蒙OS 1.0 正式版发布,面向物联网领域,鸿蒙推出了类web开发架构ACE JS = LiteOS + jerry ...
- 简单了解JSON Web令牌(JWT)
什么是JWT JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它 ...
- 小学生学习C++应该具备哪些基础?
一.电脑操作基础: 应该具备一些必要的电脑相关的知识,如操作系统的相关知识,如何打开.编辑.保存文件.对电脑的能力有一些基本的认识,以及会使用鼠标,键盘熟练输入. 磨刀不误砍柴工,至少要做到能快速找到 ...
- 操作失误不要慌,这个命令给你的Git一次反悔的机会
今天我们来介绍git当中两个非常非常好用的工具,git show和reflog. 这两个命令虽然不是必知必会,但是如果熟练使用可以极大地帮助我们查看代码仓库的问题,以及在我们操作失误的时候拯救我们.可 ...
- Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!
2020年11月12日,Spring官方发布了Spring Boot 2.4.0 GA的公告. 在这个版本中增加了大量的新特性和改进,下面我们一起看看在这个重要版本中都有哪些值得关注的内容! 更新内容 ...