【luogu P3393 逃离僵尸岛】 题解
题目链接:https://www.luogu.org/problemnew/show/P3393
被占领的点可以先连在一个点上然后只需要对这一个点bfs一遍就可以求所有的危险点
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2 * 1e5 + 10;
ll n, m, k, s, val[2], danger[maxn], ddis[maxn], dis[maxn], charge[maxn], v[maxn], u[maxn];
bool vis[maxn], vvis[maxn];
struct edge{
ll from, to, next, len;
}e[maxn<<2], ee[maxn<<2];
ll cnt, head[maxn], cntt, headd[maxn];
queue<ll> dq, q;
void add(ll u, ll v, ll w)
{
e[++cnt].from = u;
e[cnt].len = w;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
void ad(ll u, ll v, ll w)
{
ee[++cntt].from = u;
ee[cntt].len = w;
ee[cntt].next = headd[u];
ee[cntt].to = v;
headd[u] = cntt;
}
void SPFA()
{
while(!q.empty())
{
ll now = q.front(); q.pop();
vis[now] = 0;
for(ll i = head[now]; i != -1; i = e[i].next)
{
if(dis[e[i].to] > dis[now] + e[i].len && danger[e[i].to] == 0)
{
dis[e[i].to] = dis[now] + e[i].len;
if(!vis[e[i].to])
{
q.push(e[i].to);
vis[e[i].to] = 1;
}
}
}
}
}
void BFS()
{
while(!dq.empty())
{
ll now = dq.front(); dq.pop();
vis[now] = 0;
for(ll i = headd[now]; i != -1; i = ee[i].next)
{
if(ddis[ee[i].to] > ddis[now] + ee[i].len)
{
ddis[ee[i].to] = ddis[now] + ee[i].len;
if(!vvis[ee[i].to])
{
dq.push(ee[i].to);
vvis[ee[i].to] = 1;
}
}
}
}
}
int main()
{
memset(head, -1, sizeof(head));
memset(headd, -1, sizeof(headd));
memset(dis, 127, sizeof(dis));
memset(ddis, 127, sizeof(ddis));
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&k,&s,&val[0],&val[1]);
for(ll i = 1; i <= k; i++)
{
ll u;
scanf("%lld",&u);
danger[u] = 1;
ad(u, 0, 1);
ad(0, u, 1);
}
for(ll i = 1; i <= m; i++)
{
scanf("%lld%lld",&u[i],&v[i]);
ad(u[i], v[i], 1);
ad(v[i], u[i], 1);
}
dq.push(0), ddis[0] = 0, vvis[0] = 1;
BFS();
for(ll i = 1; i <= n; i++)
if(ddis[i] <= s+1)
charge[i] = 1;
for(ll i = 1; i <= m; i++)
{
if(danger[u[i]] != 1 && danger[v[i]] != 1)
{
add(u[i], v[i], val[charge[v[i]]]);
add(v[i], u[i], val[charge[u[i]]]);
}
}
q.push(1), dis[1] = 0, vis[1] = 1;
SPFA();
/*for(ll i = 0; i <= n; i++)
cout<<charge[i]<<" ";*/
printf("%lld",dis[n]-val[charge[n]]);
return 0;
}
【luogu P3393 逃离僵尸岛】 题解的更多相关文章
- luogu P3393 逃离僵尸岛-搜索剪枝+spfa
P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...
- luogu P3393 逃离僵尸岛
luoguP3393逃离_僵尸岛_ 一道洛谷不知道哪门子月赛的题 可以用此题来练习最短路算法 SPFA和dijkstra的练习题(关于Floyed,他死了 思路: 本题是最短路板子. 首先就是建立虚点 ...
- Luogu P3393 逃离僵尸岛【最短路】By cellur925
题目传送门 题目大意:(其实概括出来也就基本做完了hh)在一张有$n$个点,$m$条边的无向图上,有$k$个点是不能经过的,而与之距离不超过$s$的点,到他们会花费$Q$元,到其他点会花费$p$元,求 ...
- P3393 逃离僵尸岛
P3393 逃离僵尸岛 啊.好久不写dij手都生了 这道题就是预先处理出是否是危险城市,然后跑一个最短路就行了 然后因为我感觉这个对时间要求不大紧.判断危险城市时就写了个电风扇(DFS) 然后T飞了呜 ...
- [题解] 洛谷 P3393 逃离僵尸岛
题目TP门 很明显是一个最短路,但是如何建图才是关键. 对于每一个不可遍历到的点,可以向外扩散,找到危险城市. 若是对于每一个这样的城市进行搜索,时间复杂度就为\(O(n^2)\),显然过不了.不妨把 ...
- 洛谷⑨月月赛Round2 P3393逃离僵尸岛[最短路]
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- 洛谷P3393 逃离僵尸岛
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- luogu 3393 逃离僵尸岛
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- 洛谷P3393逃离僵尸岛 最短路
貌似一直不写题解不太好QAQ 但是找不到题啊... 随便写点水题来补博客吧 题目不pa了,点链接吧... 点我看题 很明显这是道sb题... 思路: 对于每一个僵尸城市预处理其 s 距离内的城市,然 ...
随机推荐
- 多文件上传demo
@ApiOperation(value = "批量上传", notes = "批量上传", httpMethod = "POST") @Po ...
- nodejs繁琐地自建路由
一.繁琐的自建路由 app.js var server = require('./server'); server.startServer(); server.js var http = requir ...
- codeforces之始
很早就听说acmer界的CF嘞!还记得刚开始听到神犇们在讨论CF的时候我还以为是网游CF(穿越火线)呢... 今年刚开学的时候就打算开始打cf的,由于一些事情耽搁了.之后又要准备省赛所以就一直拖到现在 ...
- SpringBoot开发(改变环境属性、读取资源文件、Bean 配置、模版渲染、profile 配置)
1.概念 SpringBoot 开发深入 2.具体内容 在之前已经基本上了解了整个 SpringBoot 运行机制,但是也需要清楚的认识到以下的问题,在实际的项目开发之中,尤其是 Java 的 MVC ...
- 记重回IT行业的面试
问点: 0,梳理一个前端知识框架 1,jQuery的理解 2,仿某网站首页,除了download,显示新优化地方 3,文档模型(DOM) 事件流 事件处理程序 事件类型 例如阻止冒泡的方法 4,前端跟 ...
- 3.获取git仓库
有两种取得 Git 项目仓库的方法. 第一种是在现有项目或目录下导入所有文件到 Git 中: 第二种是从一个服务器克隆一个现有的 Git 仓库. 在现有目录中初始化仓库 如果你打算使用 Git 来对现 ...
- atom 常用配置
基本配置 setting 位于 File -> setting 显示HTML标签闭合的竖线 Setting -> Editor Setting -> 勾选 Show Indent G ...
- python itchat 微信开发
使用itchat可以简单操作微信,进行好友和群消息的发送 安装: pip install itchat 使用: import itchat, time # 登录 itchat.auto_login(h ...
- linux 文件常用操作
linux 文件基本操作 新建文件:touch test 不会替换重名文件,并且linux一切都是文件,文件夹和文件不能重名 新建文件夹:mkdir test使用 -p 参数,同时创建父目录(如果不存 ...
- C#连接SQL Server测试
string con, sql; con = "Server=192.168.31.26;Database=TestDB;user=kala;pwd=Password"; sql ...