[题解] 洛谷 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$元,求 ...
随机推荐
- 深入了解Redis(8)-高可用方案
生产环境中的redis基本都是多节点部署,本文只讨论redis高可用的三种方案,不涉及实际操作. 一.主从复制(一主一从,一主多从,级联结构) (图来源于网络) 一个Master,两个Slave,Sl ...
- GPRS DTU的工作原理和应用场景有哪些
GPRS DTU是属于物联网无线数据终端设备的中一种,它主要是利用公用运营商的GPRS网络(又称G网)来为用户提供无线长距离数据传输的功能.一般都是采用的高性能工业级8/16/32位通信处理器和工业级 ...
- python数据分析使用matplotlib绘图
matplotlib绘图 关注公众号"轻松学编程"了解更多. Series和DataFrame都有一个用于生成各类图表的plot方法.默认情况下,它们所生成的是线形图 %matpl ...
- Socket创建简单服务器和客户端程序
使用Socket编程创建简单服务器和客户端 要知道的 Socket-AddressFamily, SocketType, ProtocolType https://blog.csdn.net/weix ...
- XX-Net 解决IPV6 不稳定,时好时坏。
一.启动IPV6 1.重置: netsh interface Teredo set state disable netsh interface Teredo set state type=defaul ...
- python开发基础(二)常用数据类型调用方法
1 数字: int 2 3 int : 转换,将字符串转化成数字 4 num1 = '123' 5 num2 = int (a) 6 numadd = num2 +1000 7 print(num2) ...
- Blazor 准备好为企业服务了吗?
如果您正在编写 .NET Web 应用程序,您很可能已经意识最近一年在.NET Web开发领域的热点都是 Blazor 的.如果你还没有了解Blazor,它允许您使用 C# 来编写 Web UIs,传 ...
- Zookeeper源码(启动+选举)
简介 关于Zookeeper,目前普遍的应用场景基本作为服务注册中心,用于服务发现.但这只是Zookeeper的一个的功能,根据Apache的官方概述:"The Apache ZooKeep ...
- Centos7安 装python3+Selenium+chrome+chromedriver
Centos7安装python3+Selenium+chrome+chromedriver详细python2和python3共存,Selenium错误的处理更新Centos源 wget -O /etc ...
- ansible快速部署cassandra3集群
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...