PTA 7-6 列出连通集
题目详情:
给定一个有 n 个顶点和 m 条边的无向图,请用深度优先遍历(DFS)和广度优先遍历(BFS)分别列出其所有的连通集。假设顶点从 0 到 n−1 编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第 1 行给出 2 个整数 n (0<n≤10) 和 m,分别是图的顶点数和边数。随后 m 行,每行给出一条边的两个端点。每行中的数字之间用 1 空格分隔。
输出格式:
按照"{ v1 v2 ... vk }"的格式,每行输出一个连通集。先输出 DFS 的结果,再输出 BFS 的结果。
输入样例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
输出样例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
题目解析
逐步分析
首先,图的表示方式。顶点数n不超过10,可以用邻接表或者邻接矩阵。因为需要按编号递增的顺序访问邻接点,所以邻接表里的每个顶点的邻接点应该按升序排列。或者,在每次访问邻接点的时候,按从小到大的顺序遍历。例如,对于邻接矩阵来说,每个顶点x的所有邻接点,可以按顶点编号从小到大遍历,即从0到n-1依次检查是否有边相连。
或者,邻接表的话,每个顶点的邻接点列表需要排序。例如,每次添加边的时候,把邻接点插入到正确的位置,保持列表的升序。或者,在生成邻接表之后,对每个顶点的邻接点列表进行排序。这一步很重要,因为DFS和BFS的遍历顺序必须按照邻接点的编号递增的顺序进行访问。所以,图的存储结构可能需要邻接表或者邻接矩阵,同时要保证遍历邻接点的顺序是递增的。
例如,邻接矩阵的话,对于每个顶点,遍历时检查所有顶点,按照编号顺序依次访问是否有边相连。这可能比较方便,特别是当顶点数目较小的时候(n<=10)。这样,在处理每个顶点的时候,只需要从0到n-1遍历,检查是否相连,并且是否未被访问过。这样就能保证按照编号递增的顺序访问邻接点。
那邻接矩阵可能更适合这个题目,因为处理顺序容易控制。比如,假设用邻接矩阵存储,那么每个顶点x的邻接点就是所有y满足matrix[x][y]为true,并且y按照从小到大排列。所以在遍历的时候,只需要从0到n-1循环,判断是否是邻接点,并且是否已访问过。
所以,邻接矩阵可能更简单。
整个流程应该是这样的:对于DFS和BFS各需要处理一次:初始化访问数组,所有顶点未被访问。然后,按照顶点编号从小到大(从0到n-1)的顺序,逐个检查顶点是否被访问。如果未被访问,则从该顶点开始进行DFS或BFS,并将访问到的顶点记录下来,形成一个连通集。这样就能保证每个连通分量都是从其中最小的顶点开始遍历,并且在遍历过程中,邻接点按照编号递增的顺序被访问。
大致步骤如下:
1. 读取输入n和m。
2. 构建邻接矩阵。初始化n×n的二维数组,初始为false。然后读取m条边,将对应的两个顶点之间的边设为true。
3. 进行DFS遍历:
a. 初始化一个访问数组visited,所有元素初始为false。
b. 按照顶点编号从小到大遍历每个顶点i:
i. 如果未被访问,则开始DFS遍历,并将结果记录为一个连通集。
ii. 在DFS过程中,将访问的顶点按顺序保存,并在结束后输出。
4. 进行BFS遍历,同样的逻辑,但使用队列。
推荐代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;void DFS(int v, vector<bool>& visited, const vector<vector<bool>>& adj, vector<int>& component) {visited[v] = true;component.push_back(v);for (int i = 0; i < adj.size(); ++i) {if (adj[v][i] && !visited[i]) {DFS(i, visited, adj, component);}}
}void BFS(int v, vector<bool>& visited, const vector<vector<bool>>& adj, vector<int>& component) {queue<int> q;q.push(v);visited[v] = true;component.push_back(v);while (!q.empty()) {int current = q.front();q.pop();for (int i = 0; i < adj.size(); ++i) {if (adj[current][i] && !visited[i]) {visited[i] = true;component.push_back(i);q.push(i);}}}
}int main() {int n, m;cin >> n >> m;vector<vector<bool>> adj(n, vector<bool>(n, false));for (int i = 0; i < m; ++i) {int u, v;cin >> u >> v;adj[u][v] = true;adj[v][u] = true;}// DFSvector<bool> visited(n, false);for (int i = 0; i < n; ++i) {if (!visited[i]) {vector<int> component;DFS(i, visited, adj, component);cout << "{ ";for (int v : component) {cout << v << " ";}cout << "}" << endl;}}// BFSvisited.assign(n, false);for (int i = 0; i < n; ++i) {if (!visited[i]) {vector<int> component;BFS(i, visited, adj, component);cout << "{ ";for (int v : component) {cout << v << " ";}cout << "}" << endl;}}return 0;
}
自我实现代码
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>using namespace std;int n,m;
int g[15][15];
int vis[15];
vector<int>res;
queue<int>q;void dfs(int x)
{res.push_back(x);vis[x]=1;for(int i=1;i<=n;++i){if(g[x][i]==1&&!vis[i]){vis[i]=1;dfs(i);}}
}void bfs(int x)
{res.push_back(x);q.push(x);vis[x]=1;while(!q.empty()){int xx=q.front();q.pop();for(int i=1;i<=n;++i){if(g[xx][i]==1&&!vis[i]){res.push_back(i);vis[i]=1;q.push(i);}}}}int main()
{cin>>n>>m;int a,b;for(int i=1;i<=m;++i){cin>>a>>b;g[a+1][b+1]=1;g[b+1][a+1]=1; }for(int i=1;i<=n;++i){if(!vis[i]){res.clear();dfs(i);cout<<"{";for(int i=0;i<res.size();++i){cout<<" "<<res[i]-1;}cout<<" }"<<endl;}}memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i){if(!vis[i]){while(!q.empty())q.pop();res.clear();bfs(i);cout<<"{";for(int i=0;i<res.size();++i){cout<<" "<<res[i]-1;}cout<<" }"<<endl;}}return 0;
}
相关文章:
PTA 7-6 列出连通集
题目详情: 给定一个有 n 个顶点和 m 条边的无向图,请用深度优先遍历(DFS)和广度优先遍历(BFS)分别列出其所有的连通集。假设顶点从 0 到 n−1 编号。进行搜索时,假设我们总是从编号最小的顶点出…...
计算机毕业设计SpringBoot+Vue.js疗养院管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
分布式系统设计(架构能力)
一、微服务架构 服务治理 Nacos 注册中心(AP模式) CAP选择:Nacos 默认采用 AP 模式(可用性 分区容忍性),通过心跳检测实现服务健康管理。服务发现:客户端定时拉取服务列表,支持权重…...
CR电路介绍
CR电路(RC电路)介绍 CR电路(电阻-电容电路)由电阻(R)和电容(C)组成,是电子系统中的基础模块,广泛用于信号处理、定时、滤波等场景。以下是其核心功能、实现方…...
Redis数据结构,渐进式遍历,数据库管理
1.Redis的其他数据结构 前面我们主要讲述了Redis中比较常用的集中数据结构String,List,Hash,Set,Zset,但这并不代表Redis只用这几种数据结构还有如Streams,Geospatial,Hyperloglog,…...
动态规划01背包问题系列一>最后一块石头的重量II
这里写目录标题 题目分析:状态表示:状态转移方程:初始化:填表顺序:返回值:代码呈现:优化版本:代码呈现: 题目分析: 状态表示: 状态转移方程&#…...
GCC编译
目录 gcc编译c语言流程: 步骤 编译器 预处理 编译 汇编 链接 完整编译 多文件编译 其他常用gcc选项 gcc编译c语言流程: 预处理大写-E 编译为大写-S ,生成汇编代码文件 汇编为小写-c 链接这里可以加-o 重命名a.out这个可…...
康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术
随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重…...
Jetson NV 上解决 PyQt5 “Could not load the Qt platform plugin ‘xcb‘“ 错误
在 Jetson NV 上运行 PyQt5 应用程序时,可能会遇到以下错误: qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. This application failed…...
计算机毕业设计Python+DeepSeek-R1大模型微博的话题博文及用户画像分析系统 微博舆情可视化(源码+ 文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
文件上传靶场(1--9关)
实验环境: 1,upload的靶场环境可以去GitHub上自行查找 2,打开小皮面板的nginx和数据库 3,将文件上传的靶场部署到本地: 放到小皮的phpstduy_pro的www下面 小提示: 另外如果你用的是php7的版本建议将版…...
2025年渗透测试面试题总结-字某某动-安全研究实习生(二面)(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 字某某动-安全研究实习生(二面) 1. 护网行动中的核心工作 2. 防护层级选择&…...
LeetCode 965题详解 | 单值二叉树的“一统江湖”:如何判断所有节点值全等?
题目如下: 解题过程如下: 示例中,即便这个结点是空结点也返回true。 若根结点不为空,那么先判断它的左孩子结点里的值是否与根结点里的值相等(这里要先确保左孩子不为空,因为左孩子结点里的值是解引用操作…...
Java阻塞队列深度解析:高并发场景下的安全卫士
一、阻塞队列的核心价值 在电商秒杀系统中,瞬时涌入的10万请求如果直接冲击数据库,必然导致系统崩溃。阻塞队列如同一个智能缓冲带,通过流量削峰和异步解耦两大核心能力,成为高并发系统的核心组件。 二、Java阻塞队列实现类对比 …...
使用 Docker 部署 RabbitMQ 并实现数据持久化
非常好!以下是一份完整的 Docker 部署 RabbitMQ 的博客文档,包含从安装到问题排查的详细步骤。你可以直接将其发布到博客中。 使用 Docker 部署 RabbitMQ 并实现数据持久化 RabbitMQ 是一个开源的消息队列系统,广泛应用于分布式系统中。使用…...
VsCode 快捷键备忘
移动光标及选择文本 Ctrl ← / → :以单词为单位移动游标Home / End:光标移到行首/行位Ctrl Home / End:光标移到文件首和文件尾Ctrl Shift \:在匹配的分隔符之间跳转 配对的分隔符 是指分隔代码元素的字符,比如字…...
蓝桥杯备考:动态规划路径类DP之矩阵的最小路径和
如题,要求左上角到右下角的最短路径,我们还是老样子按顺序做 step1:确定状态表示 f[i][j]表示(1,1)到(i,j)的最短距离 step2 :推导状态表达方程 step3:确定填表顺序,应该是从上到下,从左到右 step4:初始化 step5 找结果&#…...
大模型工程师学习日记(十五):Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析)
1. datasets 库核心方法 1.1. 列出数据集 使用 d atasets 库,你可以轻松列出所有 Hugging Face 平台上的数据集: from datasets import list_datasets# 列出所有数据集 all_datasets list_datasets()print(all_datasets)1.2. 加载数据集 你可以通过 l…...
Spring Boot 异步编程
文章目录 一、异步方法的使用1. 开启异步支持2. 定义异步方法3. 调用异步方法踩坑记录心得体会 二、线程池配置1. 自定义线程池2. 使用自定义线程池踩坑记录心得体会 三、异步任务的监控与管理1. 日志记录2. 异常处理3. 线程池监控踩坑记录心得体会 在现代应用程序开发中&#…...
golang并发编程如何学习
《掌握 Golang 并发编程的通关秘籍》 在当今的编程世界中,Golang 并发编程正以其独特的魅力和强大的能力吸引着众多开发者。然而,对于许多小伙伴来说,如何学好这门技术却成了一个头疼的问题。别担心,今天就让我来为大家揭开 Gola…...
Django 中,Form 和 ModelForm的用法和区别
在 Django 中,Form 和 ModelForm 是用于处理表单数据的两种主要方式。它们的主要区别在于是否与模型(Model)直接关联。以下是它们的用法、区别以及高级用法的详细说明: 一、Form 的使用 1. 基本用法 Form 是一个独立的表单类,不与任何模型直接关联。适用于需要手动定义字…...
SQL_语法
1 数据库 1.1 新增 create database [if not exists] 数据库名; 1.2 删除 drop database [if exists] 数据库名; 1.3 查询 (1) 查看所有数据库 show databases; (2) 查看当前数据库下的所有表 show tables; 2 数据表 2.1 新增 (1) 创建表 create table [if not exists…...
Linux网络编程
网络:不同主机,进程间通信 目的 1, 解决主机之间的硬件层面的互联互通 2,解决主机间软件层面的互联互通 IP地址:区分不同主机(软件地址) MAC地址:硬件地址 端口号:区分同…...
算法·搜索
搜索问题 搜索问题本质也是暴力枚举,一般想到暴力也要想到利用回溯枚举。 排序和组合问题 回溯法 去重问题:定义全局变量visited还是局部变量visited实现去重? 回溯问题 图论中的搜索问题 与一般的搜索问题一致,只不过要多…...
前端跨域设置 withCredentials: true
在做登录认证的时候,会出现请求未登录的情况,查看请求头的时候发现并没有把登录时的cookie设置到第二次的请求头里面。查看资料才知道跨域请求要想带上cookie,必须要在ajax请求里加上 withCredentials: true 再次访问发现请求头可以携带cook…...
使用 Arduino 和 Wi-Fi 控制 RGB LED
通过 WiFi 的 Arduino RGb LED 控制器 ,在本文中,我们将介绍下一个基于 IOT 的项目 - 使用 Wi-Fi 的 RGB LED 闪光灯。在这里,我们使用 Arduino 和 ESP8266 Wi-Fi 模块通过 Android 手机通过 Wi-Fi 控制 RGB LED 的颜色。 在这个 RGB Flash…...
html+js 轮播图
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图示例</title><style>/* 基本样式…...
蓝桥杯 Excel地址
Excel地址 题目描述 Excel 单元格的地址表示很有趣,它使用字母来表示列号。 比如, A 表示第 1 列, B 表示第 2 列, Z 表示第 26 列, AA 表示第 27 列, AB 表示第 28 列, BA 表示第 53 列&#x…...
相机几何与标定:从三维世界到二维图像的映射
本系列课程将带领读者开启一场独特的三维视觉工程之旅。我们不再止步于教科书式的公式推导,而是聚焦于如何将抽象的数学原理转化为可落地的工程实践。通过解剖相机的光学特性、构建成像数学模型、解析坐标系转换链条,直至亲手实现参数标定代码࿰…...
SCI期刊推荐 | 免版面费 | 计算机领域:信息系统、软件工程、自动化和控制
在学术研究领域,选择合适的SCI期刊对科研成果的传播与认可至关重要。了解SCI期刊的研究领域和方向是基础,确保投稿内容与期刊主题相符。同时,要关注期刊的影响因子和评估标准,选择具有较高影响力和学术认可度的期刊。阅读期刊的投…...
Cryptography 与 PyCryptodome 源码级解析
目录 Cryptography 与 PyCryptodome 源码级解析一、引言二、Cryptography 库源码解析2.1 Cryptography 库概述与设计理念2.2 核心模块与数据流分析2.2.1 目录结构与模块划分2.2.2 以 AES-GCM 模式为例的加解密实现2.2.3 源码示例解析 2.3 错误处理与边界检测 三、PyCryptodome …...
std::string的模拟实现
目录 string的构造函数 无参数的构造函数 根据字符串初始化 用n个ch字符初始化 用一个字符串的前n个初始化 拷贝构造 用另一个string对象的pos位置向后len的长度初始化 [ ]解引用重载 迭代器的实现 非const版本 const版本 扩容reserve和resize reserve resize p…...
GPU、NPU与LPU:大语言模型(LLM)硬件加速器全面对比分析
引言:大语言模型计算基础设施的演进 随着大语言模型(LLM)的快速发展与广泛应用,高性能计算硬件已成为支撑LLM训练与推理的关键基础设施。目前市场上主要有三类处理器用于加速LLM相关任务:GPU(图形处理单元…...
常见限流算法
限流是指在高并发、大流量请求的情况下,限制新的流量对系统的访问,以保证系统服务的安全性。常见的限流算法及其详细介绍如下: 计数器算法(Fixed Window Counter) 原理:使用一个固定时间窗口内的计数器来…...
美国国家航空航天局(NASA)的PUNCH任务
地球浸没在来自太阳的物质流中。这种被称为太阳风的流正在冲刷我们的星球,造成令人叹为观止的极光,影响太空中的卫星和宇航员,甚至影响地面基础设施。 美国宇航局 (NASA) 的 PUNCH(统一日冕和日球层旋光仪 Polarimeter to Unify the Corona and Heliosphere)任务将首次…...
REST API前端请求和后端接收
1、get请求,带"?" http://localhost:8080/api/aop/getResult?param123 GetMapping("getResult")public ResponseEntity<String> getResult(RequestParam("param") String param){return new ResponseEntity<>("12…...
OpenBMC:BmcWeb构造connect对象
OpenBMC:BmcWeb server.run-CSDN博客 server在接收了tcp连接请求后,会构造一个ConnectionType对象,然后通过post调度,运行该对象的start函数 1.ConnectionType类型 其实也就是using ConnectionType = Connection<Adaptor, Handler>;类型 由于ConnectionType实例化于…...
ESLint 深度解析:原理、规则与插件开发实践
在前端开发的复杂生态中,保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具,其默认规则与插件能满足多数常见需求,但面对特定团队规范或项目独特要求,自定义 ESLint 插件便成为有力的扩展手段…...
ios使用swift调用deepseek或SiliconFlow接口
调用SiliconFlow API 注册并获取API密钥:打开硅基流动平台官网Models,进行注册和认证。登录后,进入首页,点击左上角三个横杠,选择API密钥,生成密钥并复制。配置第三方应用:打开安装好的Chatbox…...
贪心算法一
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是贪心算法,并且掌握贪心算法。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! >…...
Java进阶:Dubbo
分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 软件架构的发展经历了由单体架构、垂直架构、SOA架构到微服务架构的演进过程,下面我们分别了解一下这几个架构。 1.1 单体架构 架构说明: 全部功能集中在一个项目内(All in one…...
【Day9】make/makeFile如何让项目构建自动化起飞
【Day9】make/makeFile如何让项目构建自动化起飞 使用make命令编写makefile文件依赖管理增量构建makefile注释:#makefile其他语法 make/makefile递归式工作过程 在Linux中,项目自动化构建是指使用一系列工具和脚本来自动执行软件项目的编译、测试、打包和…...
SCI1区TOP:自适应学习粒子群算法SLPSO,深度解析+性能实测
目录 1.摘要2.改进策略3.自适应学习粒子群算法4.结果展示5.参考文献6.获取代码 1.摘要 粒子群算法(PSO)是一种基于种群的随机搜索方法,广泛应用于科学和工程领域的连续空间优化问题,并已证明其高效性和有效性。许多实际问题的往往…...
迷你世界脚本显示板管理接口:DisPlayBoard
显示板管理接口:DisPlayBoard 迷你世界 更新时间: 2023-04-26 10:21:14 具体函数名及描述如下: 序号 函数名 函数描述 1 showBoard(...) 对玩家显示显示板 2 hideBoard(...) 对玩家隐藏显示板 3 setBoardPicture 对玩家设置显示板的图片…...
如何使用 LLM 生成的术语自动在搜索应用程序上构建 autocomplete 功能
作者:来自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中,通过使用 LLM 生成的词汇,为搜索应用增强自动补全功能,实现更智能、更动态的搜索建议。 自动补全是搜索应用中的一项关键功能,它通过在用户输入时实…...
电路基础:【1】PN结二极管制作电桥点亮LED灯
第一章:PN结二极管制作电桥点亮LED灯 文章目录 第一章:PN结二极管制作电桥点亮LED灯前言一、电路原理二、电路图与元器件1.电路图 做实验总结 前言 在本章中,我们将探讨如何通过PN结二极管制作电桥电路,并利用该电路点亮LED灯。L…...
蓝桥与力扣刷题(蓝桥 门牌制作)
题目:小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户,门牌号从 1 到 2020编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7&…...
unity console日志双击响应事件扩展
1 对于项目中一些比较长的日志,比如前后端交互协议具体数据等,这些日志内容可能会比较长,在unity控制面板上查看不是十分方便,我们可以对双击事件进行扩展,将日志保存到一个文本中,然后用系统默认的文本查看…...
基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程
一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架,提供了多种工具和库来构建 RESTf…...
unittest框架 核心知识的系统复习及与pytest的对比
1. unittest 介绍 是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。 核心概念: TestCase:测试用例的基类,所有测试类需继承它。 TestSuite:测试套件&a…...