题解 CodeForces 131D Subway BFS C++

news2025/1/23 22:21:33

题目传送门

Problem - 131D - Codeforceshttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/D

翻译

地铁方案,对于Berland城市来说是一种经典的表示,由一组n站点和连接这些站点的n通道组成,每个通道连接两个站点,不经过其他任何站点。此外,在经典方案中,可以沿着通道从任意一个站点到达任何其他站点。通道可以双向移动。在每对站点之间最多只有一条通道。

Berland的数学家最近证明了一个定理,即任何经典方案都有一个环路。只能有一个环路。换句话说,在任何经典方案中,都可以找到仅由站点组成的方案(其中任意相邻的两个站点都由通道连接),并且此循环不包含任何站点超过一次。

这一发明对社会产生了巨大的影响,因为现在可以根据站点距离环路的远近进行比较。例如,一个市民可以说“我离环路有三个通道”,另一个人可以回答“你这个失败者,我离环路只有一个通道”。很快,互联网上充斥着承诺计算站点到环路距离的应用程序(向短号码发送短信...)。

Berland政府决定结束这些干扰,并开始控制局势。要求你编写一个程序,可以确定城市地铁方案中每个站点距离环路的远近。

输入

第一行包含一个整数n(3 ≤ n ≤ 3000),n是地铁方案中站点(同时也是列车)的数量。然后n行包含列车的描述,每行包含一对整数xi, yi(1 ≤ xi, yi ≤ n),表示从站点xi到站点yi有一条通道。站点按任意顺序编号为1到n。保证xi ≠ yi,并且没有一对站点包含多于一条通道。通道可以双向使用。保证给定的描述表示一个经典地铁方案。

输出

打印n个数字。用空格分隔这些数字,第i个数字应等于第i个站点距离环路的距离。对于环路上的站点,打印数字0。

示例

InputcopyOutputcopy
4
1 3
4 3
4 2
1 2
0 0 0 0 
InputcopyOutputcopy
6
1 2
3 4
6 4
2 3
1 3
3 5
0 0 0 1 1 2 

思路

先找到图中的唯一环,然后从环出发进行 BFS,得到其他点到环的距离

共计两次 BFS,详情如下

怎么找环

不断从图中删掉出度为 1 的点,删到不能再删为止,剩下的一定都是环上的点

为什么这么做可以找到环?核心思路是删掉不在环上的点,保留在环上的点

画个符合题意的图分析一下,不难得出,环上的点出度不小于 2,出度为 1 的一定不是环上的点

直接删掉出度为 1 的点

随着出度为 1 的点被不断删除,原先出度不小于 2 的不在环上的点的出度也会减到 1,最终被删掉

环上的点不会在此过程中被删掉,最终留下的有且仅有环上的点

怎么实现上述找环过程

以下简称出度为 1 的点为 x,其通向的点为 y

怎么实现删掉 x

"删掉" 的目的是使原先出度不小于 2 的不在环上的点的出度减小,最终成为 x

因此,删掉 x,只需要删掉 y 通向 x 的边,y 的出度就减小了,就达到了 "删掉" 的目的

怎么删掉所有不在环上的点

一次 BFS 即可解决,BFS 前先入队当前所有的 x

对于队列中的每个 x,删掉 y 通向 x 的边,然后判断 y 的情况并做出相应反应,之后出队 x

如果 y 的出度减小到 1,说明 y 也不在环上,y 成为了 x,入队 y

如果 y 的出度大于 1,暂时不管它。如果 y 在环上,那么它的出度永远不会小于 2

否则 y 的出度有朝一日会减小到 1,到时候再收拾它

循环体中,执行出队操作时就标记出队的点不是环上的点

这样循环结束后根据标记就能区分某点在不在环上

找完环之后怎么办

找到环上的点后,以所有环上的点为起点,BFS 一次就得到答案了

第一次 BFS 删除点的操作,会影响第二次 BFS。因此要记录被删掉的边

第二次 BFS 前重新加上被删掉的边即可

代码

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
typedef pair<int, int> PII;
const int N = 3005;
vector<int> g[N];
vector<PII> del;
int n, q[N], head, tail = -1, dist[N];
bool cycle[N], mk[N];
void BFS1()
{
    for (int i = 1; i <= n; i++) //入队所有出度为 1 的点
        if (g[i].size() == 1)
            q[++tail] = i;
    while (head <= tail) //BFS 标记并删掉所有不在环上的点
    {
        int x = q[head++], y = g[x][0]; //因为 x 出度只有 1,所以用不着循环
        cycle[x] = true; //cycle[i] == true 表示点 i 不在环上
        del.push_back({ y,x }); //记录删除操作
        g[y].erase(find(g[y].begin(), g[y].end(), x)); //删掉 y 通向 x 的边
        if (g[y].size() == 1) q[++tail] = y; //如果 y 的出度减小到 1,入队 y
    }
}
void BFS2()
{
    head = 0, tail = -1;
    for (int i = 1; i <= n; i++) //入队并标记所有环上的点,以它们为起点
        if (cycle[i] == false)
            q[++tail] = i, mk[i] = true;
    for (auto& z : del) g[z.first].push_back(z.second); //撤销删除操作
    while (head <= tail) //BFS 计算距离模板
    {
        int x = q[head++];
        mk[x] = true;
        for (auto y : g[x])
        {
            if (mk[y] == false)
            {
                q[++tail] = y;
                mk[y] = true;
                dist[y] = dist[x] + 1;
            }
        }
    }
}
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    BFS1();
    BFS2();
    for (int i = 1; i <= n; i++) printf("%d ", dist[i]);
    return 0;
}

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

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

相关文章

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验&#xff0c;我自身也在不断的学习当中&#xff0c;如果文章有写的不对的地方&#xff0c;欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储&#xff0c;而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS)&#xff0c;而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…

计算机网络介质访问控制全攻略:从信道划分到协议详解!!!

一、信道划分介质访问控制 介质访问控制&#xff1a;多个节点共享同一个“总线型”广播信道时&#xff0c;可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问&#xff0c;才能减少冲突&#xff0c;甚至避免冲突? 时分复用(TDM) 时分复用&#xff1a;将时间分为等长的“…

IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力

作者&#xff1a; Haodong Hong1,2 , Sen Wang1∗ , Zi Huang1 , Qi Wu3 and Jiajun Liu2,1 单位&#xff1a;昆士兰大学&#xff0c;澳大利亚科学与工业研究组织&#xff0c;阿德莱德大学 论文标题&#xff1a;Why Only Text: Empowering Vision-and-Language Navigation wi…

C语言程序设计十大排序—冒泡排序

文章目录 1.概念✅2.冒泡排序&#x1f388;3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一&#xff0c;每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法&#xff0c;排序后的数据更易于处理和查找。在计算机发展…

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…

人工智能之深度学习_[4]-神经网络入门

文章目录 神经网络基础1 神经网络1.1 神经网络概念1.1.1 什么是神经网络1.1.2 如何构建神经网络1.1.3 神经网络内部状态值和激活值 1.2 激活函数1.2.1 网络非线性因素理解1.2.2 常见激活函数1.2.2.1 Sigmoid 激活函数1.2.2.2 Tanh 激活函数1.2.2.3 ReLU 激活函数1.2.2.4 SoftMa…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕

终端输入nvidia-smi查看cuda版本 我的是12.5&#xff0c;在网上没有找到12.5的torch&#xff0c;就安装12.1的。torch&#xff0c;torchvision&#xff0c;torchaudio版本以及python版本要对应 参考&#xff1a;https://blog.csdn.net/FengHanI/article/details/135116114 创…

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

引言&#xff1a; 今天我们聊聊Android生态中最“硬核”的话题&#xff1a;通用内核镜像&#xff08;GKI&#xff09;与内核模块接口&#xff08;KMI&#xff09;。这是内核碎片化终结者的秘密武器&#xff0c;解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…

K8S如何让worker使用kubectl命令(RBAC方法)

背景 目前集群规划如下 kubeadm安装集群master节点默认能使用kubectl命令&#xff0c;worker则不能使用。这是因为worker节点没授权。当然&#xff0c;你可以通过以下方式授权 mkdir .kube scp master1:/root/.kube/config .kube/但这样无疑给了worker节点非常大的权限&#…

【Excel】【VBA】Reaction超限点筛选与散点图可视化

【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能&#xff1a; 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…

[Computer Vision]实验三:图像拼接

目录 一、实验内容 二、实验过程及结果 2.1 单应性变换 2.2 RANSAC算法 三、实验小结 一、实验内容 理解单应性变换中各种变换的原理&#xff08;自由度&#xff09;&#xff0c;并实现图像平移、旋转、仿射变换等操作&#xff0c;输出对应的单应性矩阵。利用RANSAC算法优…

微信小程序使用picker根据接口给的省市区的数据实现省市区三级联动或者省市区街道等多级联动

接口数据如上图 省市区多级联动&#xff0c;都是使用的一个接口通过传参父类的code。返回我们想要的数据 比如获取省就直接不要参数。市就把省得code传给接口&#xff0c;区就把市的code作为参数。 <picker mode"multiSelector" :range"mulSelect1" …

自动化01

测试用例的万能公式&#xff1a;功能测试界面测试性能测试易用性测试安全性测试兼容性测试 自动化的主要目的就是用来进行回归测试 新产品--第一个版本 (具备丰富的功能)&#xff0c;将产品的整体进行测试&#xff0c;人工创造一个自动化测试用例&#xff0c;在n个版本的时候…

JS宏进阶:正则表达式的使用

正则表达式&#xff0c;对于任何一门编程语言来说&#xff0c;都是一种非常强大的工具&#xff0c;主要用于搜索、编辑或操作文本和数据。因此&#xff0c;在JS中&#xff0c;也存在相应的对象new RegExp( )&#xff0c;在本章中&#xff0c;将详细介绍正则表达式在JS宏中的运用…

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记&#xff1a;卓越强迫症强大恐惧症&#xff0c;在亲子家庭、职场关系里尤其是纵向关系模型里&#xff0c;这两种状态很容易无缝衔接。尤其父母对子女、领导对下属&#xff0c;都有望子成龙、强将无弱兵的期望&#xff0c;然而在你的面前&#xff0c;他们才是永远强大的…

SpringBoot读取yml配置文件一组对象数据初始化

1. yml的短横杠语法2. yml数组元素读取并初始化3. 测试结果 1. yml的短横杠语法 - 短横杠加空格&#xff0c;可以表示数组元素&#xff0c;如下配置 表示有名为apps的一组数据&#xff0c;数组的元素对象包含有corpId、corpSecret、appCode三个字段像server.port没有 - 表示的…