[题解] 洛谷 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$元,求 ...
随机推荐
- DateTimeFormatter接替SimpleDateFormat
java程序猿经常会碰到的一个问题就是日期格式化.当接收参数中有日期或时间,那么就需要与前端商量好其格式,这边我知道是2种:1.时间戳 2.字符串. 先说一下时间戳,这个形势的参数,Java只需new ...
- Java学习的第十五天
1.今天复习了第四章的内容 重新看了看方法参数问题,final修饰的关键字 2.今天没问题 3.明天学习多态变化
- 【新阁教育】S7.NET+Log4Net+SQLSugar+MySQL搭建Iot平台
1.搭建西门子S7仿真环境 新阁教育提醒您基于PLCSIM-Advanced搭建西门子S7仿真环境注意事项: 1.通过dotNet工控上位机公众号后台发送PLCSIM-Advanced获取软件 2.安 ...
- 如何在 Debian 9 上搭建 LNMP 环境
步骤一.安装Nginx Nginx在默认的Debian存储库中可用. 使用以下命令更新软件包索引并安装Nginx: sudo apt update sudo apt install nginx 安装过 ...
- python网络编程(TCP/IP、发邮件)
TCP/IP 关注公众号"轻松学编程"了解更多. 计算机为了联网,就必须规定通讯协议,早期的计算机网络是由各个厂商规定的一些协议,他们之间互不兼容. 为了把全世界的电脑能够连接到一 ...
- ETCD核心机制解析
ETCD整体机制 etcd 是一个分布式的.可靠的 key-value 存储系统,它适用于存储分布式系统中的关键数据. etcd 集群中多个节点之间通过Raft算法完成分布式一致性协同,算法会选举出一 ...
- #10051 Nikitosh 和异或
Nikitosh 和异或 其实题意已经简单的不能再简单了,所以就不讲了. 因为题目中 \(1\leq l_1 \leq r_1 <l_2 \leq r_2\leq N\),所以显然对于最终答案, ...
- uniapp微信小程序获取当前用户手机号码(前端)
按钮触发获取用户信息 uniapp中与微信小程序官网所写会不同, <button open-type="getPhoneNumber" @getphonenumber=&qu ...
- GANSS 87C键盘在Linux无法正常使用的解决办法
前几天在狗东入手可以一把GANSS的87C键盘,满心欢喜拆开来用却发现在开发电脑(Deepin和ubuntu)上F1-F12都不能正常使用,这对一个搞web开发的人来说,无疑是要了我的老命,无奈找各种 ...
- ubuntu常见问题有效解决办法
1.关于weget "无法建立SSL连接"的解决方法 wget在使用HTTPS协议时,默认会去验证网站的证书,而这个证书验证经常会失败. 解决办法 原命令加上"--no- ...