题解 P3393 【逃离僵尸岛】

题解 P3393 【逃离僵尸岛】

题目链接

没错这题就是单元最短路径的裸题。

同时也可以练习一下多源BFS

在处理被占领点周围的“危险点”时我们可以使用bfs,对于k个被占领点一个一个BFS显然太慢没有B格了,所以我们可以多源BFS,也就是第一次就把所有的被占领点压到队列里。

染完色以后处理每个点的权值,危险点的权值设为q,安全点的权值设为p,被占领的点权值设为一个比较大的数。

然后从点1跑最短路径就行了。

总之这是一道有点细节的模板题,要开long long不然玄学错误

代码:

/*PROPERTY OF YUANQI*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
#define N 200005
using namespace std;

inline ll read()
{
    ll x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}

ll n, m, tot, head[N], P, Q, K, S, c[N], cost[N], dis[N], vis[N];
queue < int > q;
struct edge {
    ll to, next;
    edge () {
    }
    edge (int x, int y) {
        to = x, next = y;
    }
}a[2 * N];

void addedge(ll from, ll to) {
    a[++tot] = edge(to, head[from]);
    head[from] = tot;
}

void spfa() { //他死了
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        vis[u] = false;
        for (int i = head[u]; i; i = a[i].next) {
            ll v = a[i].to;
            if (dis[u] + cost[v] < dis[v]) {
                dis[v] = dis[u] + cost[v];
                if (!vis[v]) {
                    q.push(v);
                    vis[v] = true;
                }
            }
        }
    }
}

int main()
{
    memset(dis, 0x3f3f3f3f, sizeof(dis));
    n = read(), m = read(), K = read(), S = read();
    P = read(), Q = read();
    for (int i = 1; i <= K; i++) {
        int ci = read();
        c[ci] = S + 1;
        q.push(ci);
    }
    for (int i = 1; i <= m; i++) {
        int a1 = read(), a2 = read();
        addedge(a1, a2);
        addedge(a2, a1);
    }
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        if (c[u] == 1) continue;
        for (int i = head[u]; i; i = a[i].next) {
            int v = a[i].to;
            if (!c[v]) {
                c[v] = c[u] - 1;
                q.push(v);
            }
        }
    }//多源bfs c数组表示这个点是否还能扩展
    for (int i = 1; i <= n; i++) {
        if (c[i] == S + 1) cost[i] = 1000000;
        else if (c[i]) cost[i] = Q;
        else cost[i] = P;
    }//初始化点权
    cost[1] = 0, cost[n] = 0;
    dis[1] = 0;
    q.push(1);
    vis[1] = true;
    spfa();//他死了
    cout << dis[n] << endl;
    return 0;
}

ps:最好学习一下迪杰斯特拉不然很可能被卡掉qwq
19.09.22

原文地址:https://www.cnblogs.com/YuanqiQHFZ/p/11622322.html

时间: 2024-07-31 11:37:10

题解 P3393 【逃离僵尸岛】的相关文章

洛谷⑨月月赛Round2 P3393逃离僵尸岛[最短路]

题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT...所以不能进入.由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市.换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险. 小a住在1号城市,国际空港在N号城市,这两座城市没有被侵略.小a走每一段道路(从一个城市直接到达另外一个城市)得花一整个白天,所

洛谷P3393 逃离僵尸岛

题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT...所以不能进入.由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市.换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险. 小a住在1号城市,国际空港在N号城市,这两座城市没有被侵略.小a走每一段道路(从一个城市直接到达另外一个城市)得花一整个白天,所

P3393 逃离僵尸岛

题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT...所以不能进入.由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市.换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险. 小a住在1号城市,国际空港在N号城市,这两座城市没有被侵略.小a走每一段道路(从一个城市直接到达另外一个城市)得花一整个白天,所

Luogu P3393 逃离僵尸岛【最短路】By cellur925

题目传送门 题目大意:(其实概括出来也就基本做完了hh)在一张有$n$个点,$m$条边的无向图上,有$k$个点是不能经过的,而与之距离不超过$s$的点,到他们会花费$Q$元,到其他点会花费$p$元,求1到$n$花费的最小价钱. 概括完题意也就非常明了了.我们需要把图上的点分为三类,这部分可以由一个$bfs$求得. void bfs() { while(!q1.empty()) { int u=q1.front().second; int val=q1.front().first;q1.pop()

题解——逃离僵尸岛(BFS+最短路+虚拟节点)

题解--逃离僵尸岛(BFS+最短路+虚拟节点) 一道很巧妙的最短路问题,细节也要注意 题面 Description 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT...所以不能进入.由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市.换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险. 小a住在1号城市,国际

AC日记——逃离僵尸岛 洛谷 P3393

逃离僵尸岛 思路: spfa: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 200005 #define maxque 1800056 #define INF 1e12 #define ll long long ll n,m,E[maxque],V[maxque],cnt,

逃离僵尸岛

[题目描述] 现有N个城市,城市之间有道路相连,一共有M条双向道路,保证没有自环和重边. 现有K个城市已经被僵尸控制,所以不能进入.若某个正常城市到某个僵尸城市的距离不超过S,则称此城市为危险城市. 小A住在1号城市,他想去N号城市避难,这两座城市没有被侵略.白天小A会走一段道路,晚上要住在所处城市.在正常城市需花费P元,而在危险城市,由于安保措施,所以会变贵,为Q元.所有危险城市的住宿花费相同,正常城市也是如此.且在1号城市和N号城市,小A不需要住店. 现询问从1号城市到N号城市所需要的最小花

【题解】 P3070 [USACO13JAN]岛游记Island Travels

题面有点坑,翻译内容中没有指明n的范围,通过观察原题面得到$n \leq 15$并大致猜测这是一个状态压缩dp 最小生成树显然不可行,可以举例说明存在某种情况某边要经过两次或更多 对于任意一个岛屿$i$到任意一个岛屿$j$的最短距离显然是固定的,每个岛域之间的距离(不经过其他岛屿)可以用bfs预处理出来,初始状态只要将这个岛屿全部坐标位置全部入队即可 得到了任意两个岛屿之间的直接距离后(当然存在部分岛屿不可互达),在$ n \leq 15$时可以直接用$floyd$求解 现在得到任意两个节点之间

洛谷⑨月月赛Round2 官方比赛 OI

自评: (完成时间3.5时) 第一题 模拟 虽然A了,代码敲得有点慢 第二题 最短路 第一次敲对了,又考虑数据范围和答案范围,改错了,100分改成42分.QAQ. 第三题 乱搞 80分 还可以(因为没思路啊),不过也有A了的 如果第二题不手贱的话,day1 280分,day2再随便写点,妥妥的一等. 可惜没如果.(也还好不是联赛). P3392 涂国旗 10通过 267提交 题目提供者kkksc03 标签 难度普及- 提交 讨论 题解 最新讨论 快点给钱 这不就是荷兰国旗问题吗 重复题目 题目描