(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解

news/2025/2/22 11:03:16

题目背景

小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条这样的线路。小郑需要快速回答这些问题,否则可能会失去志愿者工时。


问题描述

  1. 输入

    • N: 洛斯里克城的区域数。
    • M: 地铁线路的数量。
    • Q: 游客的询问数量。
    • N−1 条轨道:连接 N 个区域形成一棵树。
    • M 条地铁线路:每条线路覆盖树上某两点之间的最短路径。
    • Q 个游客询问:每个询问给出两个区域 (p,q),问它们是否在某条地铁线路上,如果是,统计有多少条这样的线路。
  2. 输出

    • 对于每个询问,输出满足条件的地铁线路数量。

解题思路

1. 树的基本性质

洛斯里克城的区域构成了一棵树(无环连通图),具有以下性质:

  • 任意两点之间有且仅有一条简单路径。
  • 可以通过深度优先搜索(DFS)或广度优先搜索(BFS)遍历树,计算每个节点的深度和父节点关系。
  • 最近公共祖先(LCA)可以帮助我们快速找到两点之间的路径。

2. 地铁线路的路径覆盖

每条地铁线路覆盖了树上某两点之间的最短路径。为了判断某个点对 (p,q) 是否被某条地铁线路覆盖,我们需要:

  • 找到地铁线路的起点和终点。
  • 计算这条线路覆盖的所有点对,并记录这些点对被多少条地铁线路覆盖。

3. 游客询问的处理

对于每个询问 $(p, q)$:

  • 如果 p>q,交换 p 和 q,确保点对有序。
  • 查询点对 (p,q) 被多少条地铁线路覆盖。

算法设计

方法一:

1. 构建树结构

代码

python">graph = defaultdict(list)

for _ in range(N - 1):
    u, v = map(int, input().strip().split())
    graph[u].append(v)
    graph[v].append(u)

功能

  • 使用 defaultdict(list) 构建无向图的邻接表。

  • 每条轨道连接两个区域 u 和 v,因此需要将 v 添加到 u 的邻居列表中,同时将 u 添加到 v 的邻居列表中。

示例

假设输入如下轨道信息:

复制

1 2

2 3

1 4

构建的邻接表为:

作用

  • 邻接表表示了树的结构,方便后续通过 DFS 找到任意两点之间的路径。


2. 存储地铁线路

代码

python">subway_lines = []

for _ in range(M):
    a, b = map(int, input().strip().split())
    subway_lines.append((a, b))

功能

  • 将每条地铁线路的起点 a 和终点 b 存储为元组 (a, b),并添加到列表 subway_lines 中。

示例

假设输入如下地铁线路:

作用

  • 地铁线路的起点和终点用于后续查找路径覆盖情况。


3. 深度优先搜索(DFS)

代码

python">def dfs(current, target, visited, path):
    visited[current] = True
    path.append(current)
    if current == target:
        return True
    for neighbor in graph[current]:
        if not visited[neighbor]:
            if dfs(neighbor, target, visited, path):
                return True
    path.pop()
    return False

功能

  • 使用递归实现深度优先搜索(DFS),从起点 current 开始,找到目标节点 target 的路径。

  • 参数说明:

    • current:当前访问的节点。


http://www.niftyadmin.cn/n/5862152.html

相关文章

多对二硫键成环技术

蛋白质和多肽类药物具有作用位点专一,疗效明确等优点,近年来,蛋白质和多肽类药物的研究和发展已经成为生物医药领域研究的一个热点。二硫键在维持多肽和蛋白质的空间立体结构及由此决定的生物活性中发挥着重要的作用。二硫键即为蛋白质或多肽…

33. 搜索旋转排序数组(LeetCode热题100)

题目来源&#xff1a; 33. 搜索旋转排序数组 - 力扣&#xff08;LeetCode&#xff09; 代码实现&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {//闭区间写法int nnums.size();int left0,rightn-1;while(left<right){int m…

Git笔记汇总,持续更新~

Git 是一个广泛使用的分布式版本控制系统&#xff0c;以下是一些常用 Git 命令的详细介绍&#xff1a; 仓库操作 1. git init 功能&#xff1a;在当前目录下初始化一个新的 Git 仓库。用法&#xff1a; git init示例&#xff1a;在 my_project 目录下初始化一个新的 Git 仓…

C++ 设计模式-策略模式

支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基础策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…

Linux驱动开发之音频驱动与基础应用编程

目录 CODEC芯片 音频编码 I2S总线接口 数字音频接口(DAI) 设备树配置 ALSA 音频相关概念 应用程序编写 运行测试 CODEC芯片 音频若想被CPU“听到”&#xff0c;就必须转换为CPU能够“听懂”的语言&#xff0c;即二进制数据的0和1。在信号处理领域&#xff0c;声音是模…

pandas数据存到informix数据库

紧接上文python 连接infomix&#xff0c;结合pandas&#xff0c;补充csdn在这方面的经验 。 由于无法通过sqlalchemy连接数据库ibm的informix数据库。得用jaydebeapi的jar包。 那么这篇文章就是介绍如何将十几万条的pandas的数据存到informix中。 ok&#xff0c;首先我们读取…

【从0做项目】Java音缘心动(1)———项目介绍设计

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;项目结果展示 一&#xff1a;音乐播放器Web网页介绍 二&#xff1a;前期准备工作&…

Effective Objective-C 2.0 读书笔记——协议和分类

Effective Objective-C 2.0 读书笔记——协议和分类 文章目录 Effective Objective-C 2.0 读书笔记——协议和分类在分类中添加属性使用 “class-continuation分类” 隐藏实现细节通过协议提供匿名对象 在分类中添加属性 尽管从技术上说&#xff0c;分类里也可以声明属性&…