P3393 逃离僵尸岛 bfs +最短路

P3393 逃离僵尸岛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:bfs处理出高收费城市,将价格作为点权,将点权当作边权跑最短路。由于到达 v v v,且 v v v不是终点,那么还要再走这个时候需要在该点休息,但是如果是终点就不用再休息,可以将终点点权为0。

易错点:

  • 开long long
  • bfs没用设置vis数组(脑子糊涂了,想着不全部遍历一遍可能有遗漏,却忘了bfs的性质,第一次到该点就是最小步数(后来者不能居上
  • 注意点权的设置:已经被僵尸控制的城市是不能到达的 ,危险城市是 Q Q Q,普通城市是 P P P,终点是0。
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 4e5 + 21;
struct no {
    int u;
    LL d;
    bool operator<(const no& rhs) const {
        return d > rhs.d;
    }
};
int e[N], ne[N], h[N], idx,w[N],vis[N];
LL dis[N];
void add(int u, int v) {
    e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}
int main()
{
    int n,m,K,S; cin>>n>>m>>K>>S;
    int P,Q; cin>>P>>Q;
    queue<no> q;
    for(int i = 0, x; i < K; ++i) {
        cin>>x;
        vis[x] = 1;
        w[x] = -1;
        q.push({x, 0});
    }
    memset(h, -1, sizeof(h));
    for(int i = 0; i < m; ++i) {
        int u,v; cin>>u>>v;
        add(u,v), add(v, u);
    }
    // bfs
    while(q.size()) {
        auto tmp = q.front(); q.pop();
        int u = tmp.u, d = tmp.d;
        if(d > S) continue;
        for(int i = h[u]; ~i; i = ne[i]) {
            int y = e[i];
            if(vis[y]) continue;
            if(d + 1 <= S) {
                vis[y] = 1;
                q.push({y, d + 1});
            }
        }
    }

    // 设置点权
    for(int i = 1; i <= n; ++i) {
        if(w[i] == -1) continue;
        w[i] = vis[i] ? Q : P;
    }
    for(int i = 1; i <= n; ++i) {
        dis[i] = 1e18;
        vis[i] = 0;
    }
    dis[1] = 0;
    w[n] = 0;
    // dijkstra
    priority_queue<no> heap;
    heap.push({1, 0});
    while(heap.size()) {
        auto tmp = heap.top(); heap.pop();
        int u = tmp.u, d = tmp.d;
        if(vis[u]) continue;
        vis[u] = 1;
        for(int i = h[u]; ~i; i = ne[i]) {
            int y = e[i];
            if(w[y] == -1) continue;
            if(dis[y] > dis[u] + w[y]) {
                dis[y] = dis[u] + w[y];
                heap.push({y, dis[y]});
            }
        }
    }
    cout<<dis[n];
}
相关推荐
驭渊的小故事1 小时前
NC229023 题解:二分答案求解“最大化最小值“问题
java·算法
朝朝辞暮i1 小时前
C++ 第 36 课:Action——机械臂/VLA 非常重要
开发语言·c++·算法·ros2
ra90fy1 小时前
B3873 [GESP202309 六级] 小杨买饮料
c++·算法
Omics Pro1 小时前
北理工李荣华:AI虚拟细胞证据多模态推理基准
数据库·人工智能·算法·机器学习·自然语言处理
xieliyu.2 小时前
LeetCode 1419 数青蛙:状态模拟求最少青蛙数量|Java 题解
java·算法·leetcode
acd120092 小时前
线上偶发 499 错误,并非后端服务异常
算法
Nil2082 小时前
leetcode 45跳跃游戏Ⅱ
算法·leetcode·游戏
小蒋观天下2 小时前
端侧大模型在安防摄像头部署实操(下篇)|模型量化、推理加速、视频接入与量产调优
大数据·人工智能·算法·安全·机器学习·计算机视觉·ai大模型
sinat_286945192 小时前
大模型推理:部署方式与性能优化思路
人工智能·算法·缓存·chatgpt·性能优化
longlongzihan2 小时前
LeetCode 283. 移动零:从辅助数组到双指针原地算法
c++·算法·leetcode