题解 CodeForces 131D Subway BFS C++

题目传送门

Problem - 131D - Codeforceshttps://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

思路

先找到图中的唯一环,然后从环出发进行 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何查看某用户的Git提交数

说明&#xff1a;有些公司自己搭建的Git仓库&#xff0c;可以在仓库项目上查看各用户的提交量及占比。也可通过下面这两个Git命令&#xff0c;查看当前仓库&#xff0c;当前分支的总提交数&#xff0c;及某用户的提交数&#xff1b; # 当前分支的总提交数 git log --oneline |…

SQL sever数据导入导出实验

1.创建数据库TCP-H &#xff08;1&#xff09;右键“数据库”&#xff0c;点击“新建数据库”即可 &#xff08;2&#xff09;用sql语言创建&#xff0c;此处以创建数据库DB_test为例&#xff0c;代码如下&#xff1a; use master;go--检查在当前服务器系统中的所有数据里面…

Codeforces Round 903 (Div. 3) E. Block Sequence

题解&#xff1a; 想到从后向前DP f[i] 表示从 i ~ n 转化为“美观”所需要的最少的步骤 第一种转移方式&#xff1a;直接删除掉第i个元素&#xff0c;那么就是上一步 f[i 1] 加上 1;第二种转移方式&#xff1a;从第 i a[i] 1 个元素直接转移&#xff0c;不需要增加步数&a…

linux-FTP服务配置与应用

也许你对FTP不陌生&#xff0c;但是你是否了解FTP到底是个什么玩意&#xff1f; FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为 “文传协议” 用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序…

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者&#xff1a;Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商&#xff0c; 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点&#xff0c;能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…

深度学习篇---AnacondaLabelImg

文章目录 前言第一部分&#xff1a;Anaconda是什么&#xff1f;1.简介2.特点&#xff08;1&#xff09;包管理器Conda&#xff08;2&#xff09;环境管理&#xff08;3&#xff09;预装包&#xff08;4&#xff09;跨平台&#xff08;5&#xff09;社区支持 3.安装WindowsLinux…

基于Redis实现短信验证码登录

目录 1 基于Session实现短信验证码登录 2 配置登录拦截器 3 配置完拦截器还需将自定义拦截器添加到SpringMVC的拦截器列表中 才能生效 4 Session集群共享问题 5 基于Redis实现短信验证码登录 6 Hash 结构与 String 结构类型的比较 7 Redis替代Session需要考虑的问题 8 …

Open3D计算点云粗糙度(方法一)【2025最新版】

目录 一、Roughness二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月18日。 一、Roughness 通过菜单栏的Tools > Other > Roughness找到该功能。 这个工具可以估计点云的“粗糙度”。 选择一个或几个点云,然后启动这个工具。 CloudCompare只会询问…

(二叉树)

我们今天就开始引进一个新的数据结构了&#xff1a;我们所熟知的&#xff1a;二叉树&#xff1b; 但是我们在引进二叉树之前我们先了解一下树&#xff1b; 树 树的概念和结构&#xff1a; 树是⼀种⾮线性的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09; …

洛谷P8837

[传智杯 #3 决赛] 商店 - 洛谷 代码区&#xff1a; #include<stdio.h> #include<stdlib.h> int cmp(const void*a,const void *b){return *(int*)b-*(int*)a; } int main(){int n,m;scanf("%d%d",&n,&m);int w[n];int c[m];for(int i0;i<n;…

C语言练习(17)

两个乒乓球队进行比赛&#xff0c;各出3人。甲队为A、B、C 3人&#xff0c;乙队为X、Y、Z 3人&#xff0c;并抽签决定比赛名单。有人向队员打听比赛的名单&#xff0c;A说他不和X比&#xff0c;C说他不和X、Z比&#xff0c;请编程序找出3对选手的对阵名单。 #include <stdi…

excel实用工具

持续更新… 文章目录 1. 快捷键1.1 求和 2. 命令2.1 查找 vloopup 1. 快捷键 1.1 求和 windows: alt mac : command shift T 2. 命令 2.1 查找 vloopup vlookup 四个入参数 要查找的内容 &#xff08;A2 6xx1&#xff09;查找的备选集 &#xff08;C2:C19&#xff09;…

【高阶数据结构】布隆过滤器(BloomFilter)

1. 概念 1.1 背景引入 背景&#xff1a;在计算机软件中&#xff0c;一个常见的需求就是 在一个集合中查找一个元素是否存在 &#xff0c;比如&#xff1a;1. Word 等打字软件需要判断用户键入的单词是否在字典中存在 2. 浏览器等网络爬虫程序需要保存一个列表来记录已经遍历过…

Linux内存管理(Linux内存架构,malloc,slab的实现)

文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念&#xff1a;分页管理的核心概念&#xff1a;Linux 中分页的实现&#xff1a;总结&#xff1a; 六、伙伴算法伙伴算法的核心…

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…

机器学习10-解读CNN代码Pytorch版

机器学习10-解读CNN代码Pytorch版 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习10-解读CNN代码Pytorch版1-核心逻辑脉络2-参考网址3-解读CNN代码Pytorch版本1-MNIST数据集读取2-CNN网络的定义1-无注释版…

python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖

【1】引言 前序学习了使用numpy创建单通道的灰色图像&#xff0c;并对灰色图像的局部进行了颜色更改&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;九&#xff09;用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客 之后又学习了使用numpy创…

【MySQL篇】使用mysqldump导入报错Unknown collation: ‘utf8mb4_0900_ai_ci‘的问题解决

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

WPF2-在xaml为对象的属性赋值

1. AttributeValue方式 1.1. 简单属性赋值1.2. 对象属性赋值 2. 属性标签的方式给属性赋值3. 标签扩展 (Markup Extensions) 3.1. StaticResource3.2. Binding 3.2.1. 普通 Binding3.2.2. ElementName Binding3.2.3. RelativeSource Binding3.2.4. StaticResource Binding (带参…

软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(5)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之面向服务架构设计理论与实践&#xff08;4&#xff09; 所属章节&#xff1a; 第15章. 面向服务架构设计理论与实践 第2节 SOA的发展历史 15.2 SOA的发展历史 15.2.3 SOA的微服务化发展 随着互联网技术的快速发展&a…