E - Hit and Away

news/2025/10/29 10:36:31/文章来源:https://www.cnblogs.com/onlyblues/p/19173638

E - Hit and Away

Problem Statement

You are given a simple connected undirected graph $G$ with $N$ vertices and $M$ edges.
The vertices and edges of $G$ are numbered as vertices $1,2,\ldots,N$ and edges $1,2,\ldots,M$, respectively, and edge $i$ connects vertices $U_i$ and $V_i$.
You can move bidirectionally between vertices connected by an edge in time $1$.

Additionally, each vertex is either safe or dangerous, and this state is given by a string $S$ of length $N$ consisting of S and D.
Specifically, vertex $i$ is safe when the $i$-th character $(1\leq i\leq N)$ of $S$ is S, and vertex $i$ is dangerous when it is D.
It is guaranteed that there are at least two safe vertices and at least one dangerous vertex.

For each dangerous vertex $v$, find the following value:

The minimum possible time to start from some safe vertex, pass through $v$, and move to a safe vertex different from the starting vertex.

Constraints

  • $3\leq N\leq 2\times 10^5$
  • $N-1\leq M\leq 2\times 10^5$
  • $1\leq U_i,V_i\leq N$
  • $U_i\neq V_i$
  • If $i\neq j$, then $\{ U_i,V_i \}\neq \{ U_j,V_j \}$.
  • $S$ is a string of length $N$ consisting of S and D.
  • $N,M,U_i,V_i$ are all integers.
  • $G$ is connected.
  • There are at least two safe vertices.
  • There is at least one dangerous vertex.

Input

The input is given from Standard Input in the following format:

$N$ $M$
$U_1$ $V_1$
$U_2$ $V_2$
$\vdots$
$U_M$ $V_M$
$S$

Output

Let $K$ be the number of dangerous vertices in $G$, and print $K$ lines.
On the $i$-th line $(1\leq i\leq K)$, print the answer for the $i$-th dangerous vertex when the dangerous vertices are arranged in ascending order of vertex number.


Sample Input 1

5 5
1 2
1 3
2 3
3 4
4 5
SSDDS

Sample Output 1

2
3

The dangerous vertices are (in ascending order of vertex number) vertices $3$ and $4$.

For vertex $3$, moving from vertex $1$ $\to$ vertex $3$ $\to$ vertex $2$ (for example) satisfies the condition.
The time required for this movement is $2$, and this is the minimum.
Therefore, print $2$ on the $1$st line.

For vertex $4$, moving from vertex $1$ $\to$ vertex $3$ $\to$ vertex $4$ $\to$ vertex $5$ (for example) satisfies the condition.
The time required for this movement is $3$, and there is no way to move that satisfies the condition with time $2$ or less, so this is the minimum.
Therefore, print $3$ on the $2$nd line.


Sample Input 2

3 2
1 2
2 3
SSD

Sample Output 2

3

The dangerous vertex is vertex $3$.

Moving from vertex $1$ $\to$ vertex $2$ $\to$ vertex $3$ $\to$ vertex $2$ (for example) satisfies the condition.
The time required for this movement is $3$, and this is the minimum.
Note that movements such as vertex $2$ $\to$ vertex $3$ $\to$ vertex $2$ do not satisfy the condition that the destination is "different from the starting vertex".

 

解题思路

  一个从安全点出发、经过一个危险点再到达另一个不同安全点的路径,可以表示为 $S_1 \to D \to S_2$,其中 $S_1 \ne S_2$。由于是无向图,这条路径可以被拆分为两个独立的部分:$D \to S_1$ 和 $D \to S_2$。为了使整体路径长度最小,需要分别求出 $D \to S_1$ 和 $D \to S_2$ 的最短距离。因此本题就是对每个危险点 $D_i$,找到距离其最近的两个不同的安全点 $S_1$ 和 $S_2$。显然如果对每个危险点 $D_i$ 分别跑一次 bfs,时间复杂度将达到 $O\left(n(n+m)\right)$。

  本题需要在多源 bfs 的基础上进行修改,但由于对 bfs 的原理理解得还不够深刻,赛时没做出来。下面先给出具体做法,再解释其正确性。

  我们首先只考虑计算每个 $D_i$ 到最近安全点的距离。此时将所有的安全点作为源点跑一次多源 bfs,就能得到每个 $D_i$ 到其最近安全点的最短距离,记作 $d_1$。但我们现在还需要考虑 $D_i$ 到另一个不同的安全点的最短距离,把这个距离记作 $d_2$。为了确保 $d_2$ 对应的安全点与 $d_1$ 不同,我们需要在计算 $d_1$ 时记录其对应的源点 $f_1$。同样在计算 $d_2$ 时,也记录其对应的源点 $f_2$。在 bfs 的过程中,如果 $u$ 的 $d_1[u]$(或 $d_2[u]$)可以更新 $v$ 的 $d_2[v]$,那么只有当 $f_1[u] \ne f_1[v]$(或 $f_2[u] \ne f_1[v]$)时,才允许更新。

  整个修改后的多源 bfs 流程如下代码所示,其中队列 q 中的元素是一个三元组 $(d,u,p)$,表示 $u$ 到安全点 $p$ 的最短距离 $d$,$p$ 是该距离对应的源安全点。

queue<array<int, 3>> q;
for (int i = 1; i <= n; i++) {
    if (s[i] == 'S') {
        q.push({0, i, i});
        d1[i] = 0;
        f1[i] = i;
    }
}
while (!q.empty()) {
    auto [d, u, p] = q.front();
    q.pop();
    for (int i = h[u]; i != -1; i = ne[i]) {
        int v = e[i];
        if (d1[v] > d + 1) {
            d1[v] = d + 1;
            f1[v] = p;
            q.push({d1[v], v, p});
        }
        else if (d2[v] > d + 1 && f1[v] != p) {
            d2[v] = d + 1;
            f2[v] = p
            q.push({d2[v], v, p});
        }
    }
}

  接下来将解释为什么上述方法是正确的,可以找到每个危险点 $D$ 到两个不同安全点的最短距离。

  首先,需要了解(单源/多源)bfs 的正确性原理,即 bfs 会按距离递增的顺序依次访问节点。具体来说,从源点集合出发,bfs 会访问距离源点集合为 $0$ 的节点,然后再访问距离为 $1$ 的节点,以此类推。这样,当某个节点第一次被访问时,此时的距离一定是该节点到源点集合的最短距离。此外,节点在第一次被访问并更新后会被加入队列,以更新其相邻节点。如果节点不是第一次被访问,则不会更新,也不会被重新加入队列。正如前面所提到的,bfs 会按照距离递增的顺序访问节点,当再次访问某个节点时,此时的距离一定不小于该节点第一次访问时的距离,因此不会更新,也不会重新入队(因为相邻节点已经被用最短距离更新过了)。

修改后的多源 bfs 仍然保持了按距离递增的顺序来访问节点的特性。与朴素的 bfs 一样,更新操作发生时,新的节点会被加入到队列,并且这些节点的距离比当前(更新它的)节点大 $1$。因此从该特性可以推断出,得到的 $d_2$ 一定是来自与 $d_1$ 不同源点的最短距离。

  但有一点可能引起疑惑:为什么在更新了 $v$ 的 $d_2$ 后,还需要将 $v$ 再次入队?这是因为 $v$ 的 $d_2$ 更新后,可能会更新其相邻节点的 $d_2$。举例来说,如果 $v$ 的 $d_1$ 更新了其相邻节点的 $d_1$,那么在更新了 $v$ 的 $d_2$ 后,有可能会继续更新相邻节点的 $d_2$。因此,重新将 $v$ 入队是必要的,以确保所有节点的最短路径都得到更新。

  AC 代码如下,时间复杂度为 $O(n + m)$:

#include <bits/stdc++.h>
using namespace std;typedef long long LL;const int N = 2e5 + 5, M = N * 2;char s[N];
int h[N], e[M], ne[M], idx;
int d1[N], d2[N], f[N];void add(int u, int v) {
    e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    memset(h, -1, sizeof(h));
    while (m--) {
        int u, v;
        cin >> u >> v;
        add(u, v), add(v, u);
    }
    cin >> s;
    memmove(s + 1, s, n + 1);
    memset(d1, 0x3f, sizeof(d1));
    memset(d2, 0x3f, sizeof(d2));
    queue<array<int, 3>> q;
    for (int i = 1; i <= n; i++) {
        if (s[i] == 'S') {
            q.push({0, i, i});
            d1[i] = 0;
            f[i] = i;
        }
    }
    while (!q.empty()) {
        auto [d, u, p] = q.front();
        q.pop();
        for (int i = h[u]; i != -1; i = ne[i]) {
            int v = e[i];
            if (d1[v] > d + 1) {
                d1[v] = d + 1;
                f[v] = p;
                q.push({d1[v], v, p});
            }
            else if (d2[v] > d + 1 && f[v] != p) {
                d2[v] = d + 1;
                q.push({d2[v], v, p});
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        if (s[i] == 'D') cout << d1[i] + d2[i] << '\n';
    }
    
    return 0;
}

 

参考资料

  Editorial - Polaris.AI Programming Contest 2025(AtCoder Beginner Contest 429):https://atcoder.jp/contests/abc429/editorial/14274

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年耙式机械格栅除污机工厂权威推荐榜单:破碎格栅机 /回转式机械格栅/拦污格栅源头厂家精选

在污水处理领域,机械格栅作为预处理环节的关键设备,其性能直接影响后续处理流程的效率与效果。根据最新市场调研数据显示,2024年我国污水处理设备市场规模已达到约1500亿元,预计到2025年将保持稳定增长态势。 机械…

数组与字典解决方案第三十讲:如何将记录集的数据记入数组 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年旗台石栏杆制造企业权威推荐榜单:旗台座栏杆 /汉白玉旗台/汉白玉栏杆旗台源头厂家精选

在石雕艺术与建筑装饰领域,这四家标杆企业以精湛工艺与创新设计引领着旗台石栏杆行业的发展方向。 在建筑装饰与园林景观领域,旗台石栏杆作为兼具功能性与艺术性的重要构件,其品质优劣直接关系到工程项目的整体效果…

2025年知识管理系统推荐:几款融合AI能力的智能知识库全面对比

2025年知识管理系统推荐:几款融合AI能力的智能知识库全面对比“小李,新来的实习生问你咱们项目的API鉴权机制文档在哪,你找找?” 那天下午,技术主管突然给我抛来这个问题。我心头一紧——这文档上次更新还是半年前…

2025 年机箱机柜厂家最新推荐榜,技术实力与市场口碑深度解析含 Q235/304 不锈钢 / 5052 铝等多材质优质品牌

引言 在数字化与工业化融合加速的背景下,机箱机柜作为设备防护核心载体,其品质直接影响数据中心、工业控制等场景的运行稳定性。据电子设备工业协会 2025 年 Q3 测评数据显示,国内机箱机柜市场品牌超 800 家,但通过…

️为什么越来越多企业从Web转向桌面端?兰亭妙微解读QT界面的复兴

️为什么越来越多企业从Web转向桌面端?兰亭妙微解读QT界面的复兴从能用,到好用:小程序进化的关键一步 在数字化浪潮中,小程序已然成为企业连接用户的关键桥梁。起初,小程序只要 “能用”,能实现基本功能,满足用…

2025年电厂标牌厂家权威推荐榜单:腐蚀标牌 /反光标牌/丝印标牌源头厂家精选

随着我国电力基础设施建设的持续投入,电厂标牌市场需求稳步增长,其中防腐、反光和丝印标牌已成为保障电力设施安全运行的关键产品。 据行业数据显示,2025年中国电力设施标牌市场规模预计将达到87亿元,年均增长率保…

2025 年同声传译 APP 推荐:翻译鸥AI 智能同传、视频与图片翻译工具详解,多场景适配的高性价比之选

行业背景 全球化深入与数字经济发展推动跨语言沟通需求爆发式增长,2024 年中国同声传译软件行业市场规模达 76.8 亿元,预计 2025 年将攀升至 94.3 亿元,商务会议、在线教育等场景占比超 68%。但传统解决方案痛点显著…

深入解析:[UnrealEngine] 虚幻引擎UE5地形入门指南 | UE5地形教程(UE5 Terrain)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年酒店桌布厂家最新推荐榜,技术实力与市场口碑深度解析

引言 桌布作为酒店餐饮空间的核心布艺单品,其品质直接影响宾客体验与运营成本。为破解市场同质化、功能不达标等痛点,中国纺织品商业协会联合第三方检测机构开展 2025 年度酒店桌布品牌测评,覆盖 32 家主流品牌的 1…

Apache SeaTunnel 9 月动态:多模块修复 + 新功能上线,社区贡献成果亮眼

本月,社区 21 位贡献者共同参与了 Apache SeaTunnel 的修复与功能升级,助力数据同步能力提升。各位热爱 Apache SeaTunnel 的小伙伴们,社区 9 月份月报来啦! 本月,社区 21 位贡献者共同参与了 Apache SeaTunnel 的…

ssh 连接服务失败

主要是新安装使用的最容易忽略的问题,就是端口的开启(22) 一般安装之后是直接使用的,这个也没问题,但是如果自己的端口没有开启,其他用户是不能ssh连接登录的, 所以经常会出现这个用户可以连接登录其他其他用户…

2025年新疆旅游公司权威推荐榜单:阿勒泰旅游/新疆旅游线路/喀纳斯旅游服务商精选

据新疆维吾尔自治区文化和旅游厅数据统计,2024年新疆接待游客总量突破2.5亿人次,同比增长超过30%。 然而同期旅游投诉量同比上升15%,其中强制购物、临时加价、行程缩水等问题占比高达62%。 游客对高品质旅游服务的需…

Git常用命令的详细指南

一、仓库基础操作命令 作用 示例git init 初始化新仓库 git init projectgit clone 克隆远程仓库 git clone https://github.com/user/repo.gitgit status 查看工作区状态 git status -s(简洁模式)二、文件操作管理命…

2025 年伸缩门厂家最新推荐榜:技术实力与市场口碑深度解析,高性能与可靠性兼具的优质品牌指南

引言 伴随智能出入口设备市场规模突破百亿大关,伸缩门作为安防与基建核心组件,其品质筛选成为用户核心痛点。为破解行业资质参差、技术同质化等问题,本次推荐榜依托建筑金属结构协会测评标准,构建 “五维评分模型”…

支持私有化本地部署|域名证书管理系统白皮书 - ops

摘要 在当今以多云、容器化和DevOps为特征的IT新范式下,企业域名及DNS管理面临着前所未有的挑战:资产分散、配置复杂、变更频繁、安全风险高企以及合规压力巨大。域名管理系统是一款专为应对这些挑战而设计的企业级解…

2025 年杀虫公司最新推荐榜,技术实力与市场口碑深度解析

引言 虫害防控直接关系人居安全与企业生产,而市场上 83% 的服务纠纷源于方案同质化与效果无保障。为精准筛选优质服务商,本次推荐结合北京有害生物防制协会《居家环境有害生物防制服务规程》团体标准,采用 “三维测…

现在的微小型企业都压工资了吗

现在的微小型企业都压工资了吗在山东某栋梁公司工作,9月份发的是8月份的工资,然后9月份交的五险一金说是10月份工资中的,然后10月份发的是9月份的工资;不过在9月份离职了,在10月月底收到9月份的工资时告诉我说9月…

2025 年快速卷帘门厂家最新推荐榜,技术实力与市场口碑深度解析,优选智能定制与高效供货优质企业

引言 当前快速卷帘门市场需求攀升,但品牌繁杂、产品质量悬殊,部分厂家以次充好致设备故障频发,且多数品牌定制能力不足、供货滞后、售后薄弱,让用户选购困难。为解决此痛点,帮助用户精准筛选出兼具技术实力与良好…

2025 年电动门厂家最新推荐榜,深度剖析企业技术实力、服务水平与市场口碑

引言 当前出入口智能化设备市场中,电动门凭借便捷、安全、智能的优势,已成为商业建筑、政府机构、场馆设施等场景的核心配置。但随着行业规模扩大,品牌数量激增,产品质量参差不齐 —— 部分品牌缺乏核心技术导致设…