第十五届蓝桥杯省赛第二场C/C++B组F题【狡兔k窟】题解(AC)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意分析

有一个 n n n 个点, n − 1 n-1 n1 条边的无向图,边权均为 1 1 1

每个点隶属于一个集合,同一个集合的点可以互相传送。

给定 m m m 个询问,求 x , y x, y x,y 的最短距离。

最短路解法

步骤:

  1. 建图。
  2. 对于所有询问各跑一次最短路算法。

可选用的最短路算法:

  • Spfa,单次时间复杂度 O ( n ) ∼ O ( n 2 ) O(n) \sim O(n^2) O(n)O(n2),总时间复杂度 O ( n 2 ) ∼ O ( n 3 ) O(n^2) \sim O(n^3) O(n2)O(n3)
  • Dijkstra,单词时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),总时间复杂度 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn)
01 BFS 解法

观察发现,本题仅存在边权为 0 0 0 1 1 1 的边,故上述最短路算法存在多余开销,我们考虑使用 BFS 算法进行求解,并使用 deque 进行维护。

进行扩展时,若是边权为 0 0 0 的边,则放入队头,反之放入队尾。

最坏时,每条边均扩展 n n n 个点,单次时间复杂度 O ( n 2 ) O(n^2) O(n2),总时间复杂度 O ( n 3 ) O(n^3) O(n3)

BFS 解法

样例如下:
在这里插入图片描述
我们用虚线表示同一个组别中的连线。

在这里插入图片描述

合并 1 , 4 1, 4 1,4

在这里插入图片描述
合并 2 , 6 2, 6 2,6

在这里插入图片描述
合并 3 , 5 3, 5 3,5

在这里插入图片描述
那么,在合并之后,当我们要算两个点之间的最短距离时,可以直接用 BFS 算法解决。

观察上图发现,因为组别内的点的边权为 0 0 0,所以我们可以将所有同一个组别的点进行合并,将点于点之间的最短路转换为组别于组别之间的最短路。

单词时间复杂度 O ( n ) O(n) O(n),总时间复杂度 O ( n 2 ) O(n^2) O(n2)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>using namespace std;const int N = 5e3 + 10, M = N * 4;int n, m;
int h[N], e[M], w[M], ne[M], idx;
int belong[N];
vector<int> g[N];
int dist[N];
bool st[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}void bfs(int u, int v)
{memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);dist[u] = 0;queue<int> q;q.push(u);while (q.size()){auto t = q.front();q.pop();for (int i = h[t]; ~i; i = ne[i] ){int j = e[i];if (dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];q.push(j);}}}cout << dist[v] << endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m;memset(h, -1, sizeof h);for (int i = 1; i <= n; ++ i ){int x;cin >> x;belong[i] = x;g[x].push_back(i);}for (int i = 1; i < n; ++ i ){int a, b;cin >> a >> b;a = belong[a], b = belong[b];add(a, b, 1), add(b, a, 1);}while (m -- ){int a, b;cin >> a >> b;bfs(belong[a], belong[b]);}return 0;
}

【在线测评】

在这里插入图片描述

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

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

相关文章

N5245B PNA-X 微波网络分析仪

N5245B PNA-X 微波网络分析仪 " 900 Hz/10 MHz 至 50 GHz " N5245B PNA-X 微波网络分析仪&#xff0c;900 Hz/10 MHz 至 50 GHz&#xff0c;2 端口和 4 端口&#xff0c;多达三个信号源。 特点 实现卓越性能 这款 PNA-X 分析仪不仅仅是一款矢量网络分析仪&a…

《QT实用小工具·四十》显示帧率的控件

1、概述 源码放在文章末尾 该项目实现了可以显示帧率的控件&#xff0c;项目demo演示如下所示&#xff1a; 、 项目部分代码如下所示&#xff1a; #ifndef FPSITEM_H #define FPSITEM_H#include <QQuickItem>class FpsItem : public QQuickItem {Q_OBJECTQ_PROPERTY(i…

ubuntu20 解决网线不能联网 RTL8111/8168/8411

这种问题一般是驱动没有正确安装。 ----RTL8111/8168/8411是一块比较坑的网卡。 1、 查看网卡信息 lspci |grep Ethernet2、 对于高版本的Ubuntu&#xff0c;能直接使用命令安装驱动。下面的r8168-dkms需根据网卡信息修改&#xff0c;上面的网卡信息还有8111&#xff0c;但逐个…

PostgreSQL 排查链接锁问题常用SQL语句

目录 1. 背景 2. 常用SQL语句 2.1. 查询PostgreSQL设置的最大连接数 2.2. 查询当前使用中的连接数 2.3. 查询当前所有连接数据库用户和用户其连接数 2.4. 查询是否存在锁表记录 2.5. 查询详细的锁信息 2.6. 如何解锁&#xff1f; 2.6.1. 定位并终止阻赛的事务 2.6.1.…

某企业征信Oracle数据库跑批耗时较长问题简述分析报告

1. 分析及解决方案概述 分析原因 由于对跑批涉及的表在周末6点前进行了清数&#xff0c;Oracle周末自动收集统计信息的时间为早上6点&#xff0c;此时的表内数据量为0&#xff0c;导致对该表的执行计划发生了变化。因此在下午跑批过程中走的错误的执行计划&#xff0c;导致数…

HarmonyOS —— 仿 XPermission 鸿蒙权限申请工具类

仿 XPermission 写一个简单的鸿蒙权限申请工具类。 import { abilityAccessCtrl, bundleManager, Context, Permissions } from kit.AbilityKit import { ArrayList } from kit.ArkTSexport class PermissionUtil {private static readonly sUtil: PermissionUtil new Permis…

CUDA的应用场景

CUDA的应用场景随着技术的发展不断扩展&#xff0c;其核心优势在于能够显著提高并行计算任务的处理速度&#xff0c;这对于任何需要处理大量数据和执行复杂计算的领域都是极其有价值的。CUDA开发的应用场景非常广泛&#xff0c;主要得益于其强大的并行计算能力&#xff0c;以下…

buuctf——[CISCN2019 华北赛区 Day2 Web1]Hack World

buuctf——[CISCN2019 华北赛区 Day2 Web1]Hack World 1.根据提示&#xff0c;说明flag在表里 2.那就猜测存在sql注入&#xff0c;反手测试一波id1 3.尝试使用1--进行注释 4.直接丢进salmap里吧&#xff0c;不出意外多半是跑不出来 5.直接放入fuzz里进行测试 6.发现当我…

iOS - 多线程-GCD

文章目录 iOS - 多线程-GCD1. 常见多线程方案2. GCD2.1 GCD的常见函数GCD中有2个用来执行任务的函数 2.2 GCD的队列2.2.1 GCD的队列可以分为2大类型 2.3 容易混淆的术语2.4.1 有4个术语比较容易混淆&#xff1a;同步、异步、并发、串行 2.4 各种队列的执行效果 3. 死锁3.1 死锁…

Composer初次接触

php一直都是简单处理一下单片机的后台服务&#xff0c;没什么深入研究 今天安装一个 php composer.phar require qiniu/php-sdkComposer完全不懂&#xff0c;照着一试&#xff0c;就报错了 - topthink/think-installer v1.0.12 requires composer-plugin-api ^1.0 -> found…

ThreeJs模拟工厂生产过程三

上节课绘制了车间模型&#xff0c;但是车间里只有一条产线&#xff0c;这节把产线多铺设几条&#xff0c;放满整个车间&#xff0c;但是随着放满车间吗&#xff0c;也就意味着要创建更多的模型&#xff0c;而更多的模型会导致浏览器卡顿&#xff0c;所以这个节讲如何做模型合并…

linux 下如何确定驱动是否已经正常加载了

1.系统日志 嵌入式系统&#xff0c;使用dmesg 指令&#xff0c;如&#xff1a; # dmesg | grep usb [ 0.253890] usbcore: registered new interface driver usbfs [ 0.253951] usbcore: registered new interface driver hub [ 0.254026] usbcore: registered new …

Python | Leetcode Python题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution:def rotate(self, matrix: List[List[int]]) -> None:n len(matrix)# 水平翻转for i in range(n // 2):for j in range(n):matrix[i][j], matrix[n - i - 1][j] matrix[n - i - 1][j], matrix[i][j]# 主对角线翻转for …

Python400集 视频教程,手把手带你零基础手写神经网络!!

嗨喽&#xff0c;大家好&#xff0c;今天又要给大家整一波福利了&#xff01; 学习编程&#xff0c;最忌讳就是今天一个教程&#xff0c;明天一个教程&#xff0c;频繁更换教程&#xff0c;增加自己的学习成本&#xff0c;对于新手小白会是一件严重打击自信心的事情。所以今天…

【嵌入式经验积累】锂电池与充电

文章目录 警告锂电池的基本参数锂电池的材料锂电池的充电阶段预充电恒流充电恒压充电复充电锂电池的充电温度范围锂电池的放电温度范围锂电池充电芯片警告 以下警告是由国内一家锂电池厂商告知的: 锂电池只有过充和过热才会爆炸(非外力)。所以一定要保证锂电池在充电过程中不…

Jmeter实现参数化的四种方法

目录 一、CSV Data Set Config/CSV数据文件设置 二、函数助手 1、Random函数 2、RandomString随机字符串 3、CSVRead 4、time 5、UUID 三、计数器&#xff08;Counter&#xff09; 参数化&#xff1a;自动化测试脚本的一种常用技巧&#xff0c;事先准备好数据&#xff…

四川尚熠电子商务有限公司抖音电商新势力的崛起

在当下这个数字化高速发展的时代&#xff0c;电子商务已经成为推动经济增长的重要引擎之一。四川尚熠电子商务有限公司&#xff0c;作为一股新兴的电商力量&#xff0c;专注于抖音电商服务&#xff0c;凭借其独特的市场洞察力和创新精神&#xff0c;正逐步在激烈的市场竞争中崭…

portaudio 怎么调用获取输出流

PortAudio是一个跨平台的音频I/O库&#xff0c;它允许你访问计算机的音频硬件进行录音和播放。要使用PortAudio获取输出流&#xff08;播放流&#xff09;&#xff0c;你需要遵循以下步骤&#xff1a; 官方下载地址&#xff1a;PortAudio - an Open-Source Cross-Platform Audi…

安全评估报告 项目安全风险评估报告 信息安全评估报告

一、安全评估报告的意义 安全评估报告是对特定环境、设施或系统安全性进行全 面分析、评估和预测的重要工具。它通过对潜在风险的识别、分析和评价&#xff0c;帮助决策者了解当前安全形势&#xff0c;制定科学的安全策略&#xff0c;从而有 效预防和减少安全事故的发生。安全…

Linux 系统IO函数之open函数

open函数 要点&#xff1a; int open(const char *pathname, int flags); perror函数 close函数 控制台输入&#xff1a; man 2 open2 表示第二章&#xff08;Linux系统IO函数位于第二章&#xff09;&#xff0c;第三章是标准C库的一些函数部分输出&#xff1a; 1、open函数返…