1397: 图的遍历——广度优先搜索

2023-09-12 15:27:14

题目描述

广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点。重复上述过程,直至图中所有顶点都被访问到为止。
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。

输入

输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。

输出

只有一行,包含n个整数,表示按照题目描述中的广度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。

样例输入

0 0 0 1
0 0 1 1
0 1 0 1
1 1 1 0

样例输出

0 3 1 2 

提示

在本题中,需要熟练掌握图的邻接矩阵存储方式。在建立完成无向图之后,需要严格按照题目描述的遍历顺序对图进行遍历。在本题中需要使用队列结构,需要对队列的概念进行复习。
通过这道题目,应该能够对图的广度优先搜索建立更加直观和清晰的概念。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
struct Graph{//邻接表存储 
	int vnum;//图中结点个数 
	vector<int>e[N];//行不可变,列可变的二维数组 
};
bool vis[N];//访问标记数组,用于标记已经访问过的结点

void bfs(Graph &G,int x){//从图中结点x开始遍历 
	queue<int>q;//bfs需要有队列来辅助遍历
	q.push(x);
	vis[x]=1;//在入队的时候就要把当前访问的结点x标记为已访问
	while(q.empty()==false){//队列非空时,继续访问,等价写法while(!q.empty())
		int p = q.front();//p赋值为当前队列的队头结点的值 
		q.pop();//将队头结点出队
		printf("%d ",p); 
		for(int i=0;i<G.e[p].size();++i){//扫描遍历p结点的所有邻接点,即队头结点的所有邻接点 
			if(vis[G.e[p][i]]==0){//如果当前结点没有被访问过,则入队并标记为已访问 
				q.push(G.e[p][i]);//在入队的时候就要把入队的结点标记为已访问,目的是为了防止后续结点有相同的邻接点时造成重复入队 
				vis[G.e[p][i]]=1;//G.e[p][i]表示邻接表G的第p行,第i列的结点,即p的第i个邻接点 
			}
		}
	}
} 
void bfsTravel(Graph &G){
	memset(vis,0,sizeof(vis));//初始化访问数组(如果有多组测试输入一定要初始化)
	for(int i=0;i<G.vnum;++i){
		if(!vis[i]){
			bfs(G,i);
		}
	}	 
}
int main(void){
	Graph G;
	scanf("%d",&G.vnum);//输入结点个数 
	for(int i=0;i<G.vnum;++i){
		for(int j=0;j<G.vnum;++j){
			int flag;
			scanf("%d",&flag);
			if(flag==1){//如果输入为1,则说明e[i][j]存在无向边 
				G.e[i].push_back(j);//在邻接表第i行后面加上一个j,表示i和j有边 
				//此操作相当于邻接矩阵输入直接转换成邻接表 
			}
		}
	}
	bfsTravel(G);
	return 0;
}

更多推荐

SQL plus简单使用

查看Oracle数据库全部数据库数据库名称SELECTnameFROMv$database;这将返回所有数据库的名称。视图通过SQL查询dba_registry视图:另一个查看数据库的方法是查询dba_registry视图,该视图包含了数据库中安装的所有组件的信息。以下是示例SQL查询:SELECTcomp_nameF

我的git笔记

git加速https://ghproxy.com/https://github.com/cudpp/cudpp.gitgitclonehttps://ghproxy.com/https://github.com/triple-Mu/YOLOv8-TensorRT.git安装git#删除当前gitsudoapt-getr

002-第一代硬件系统架构确立及产品选型

第一代硬件系统架构确立及产品选型文章目录第一代硬件系统架构确立及产品选型项目介绍摘要硬件架构硬件结构选型及设计单片机选型上位机选型扯点别的关键字:Qt、Qml、信号采集机、数据处理、上位机项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记反正都有学不完的技术,不如就学一学clickhouse吧文章目录clickhouse学习笔记clickhouse的特点1.列式存储2.DBMS的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行clickhouse安装1.关闭防火墙2.CentOS取消打开文件数限制3.安装依赖4.

在SpringBoot中如何整合数据源?

在企业级应用开发中,数据存储是必不可少的一环。为了简化数据访问层的开发,SpringBoot提供了对多种数据源的整合支持。本文将介绍如何在SpringBoot项目中整合常见的数据源,包括JdbcTemplate、MyBatis和JPA,并探讨如何配置和使用多数据源。1.数据源的选择与配置1.1.常见的数据源类型在Jav

2020-2023中国高等级自动驾驶产业发展趋势研究-概念界定

1.1概念界定自动驾驶发展过程中,中国出现了诸多专注于研发L3级以上自动驾驶的公司,其在业界地位也越来越重要。本报告围绕“高等级自动驾驶”展开,并聚焦于该技术2020-2023年在中国市场的变化趋势进行研究。1.1.1什么是自动驾驶自动驾驶汽车[1]是指:搭载先进车载传感器、控制器、执行器等装置,并融合现代通信与网络技

SQL Server 入门知识

🙈作者简介:练习时长两年半的Javaup主🙉个人主页:程序员老茶🙊ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎📚系列专栏:Java全栈,计算机系列(火速更新中)💭格言:种一棵树最好的时间是十年前,其次是现在🏡动动小手,点个关注不迷路,感谢宝子们一键三连目录课程名:SQLServer内容/作用

Redis面试题(三)

文章目录前言一、怎么理解Redis事务?二、Redis事务相关的命令有哪几个?三、Rediskey的过期时间和永久有效分别怎么设置?四、Redis如何做内存优化?五、Redis回收进程如何工作的?六、加锁机制总结前言怎么理解Redis事务?Redis事务相关的命令有哪几个?Rediskey的过期时间和永久有效分别怎么设

系统架构设计师(第二版)学习笔记----系统分析与设计及测试

【原文链接】系统架构设计师(第二版)学习笔记----软件测试文章目录一、结构化方法1.1结构化开发方法1.2结构化分析使用的手段1.3结构化分析的步骤1.4数据流图(DFD)的基本元素1.5数据流图(DFD)方法建模过程1.6数据字典的组成1.7概要设计的主要任务1.8结构化开发的准则1.9耦合的类型1.10内聚的类型

Linux系统--多线程

文章目录线程的概念创建线程线程退出一、线程的概念线程在进程内部执行,是OS调度的基本单位。在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都

面试系列之《Linux&Shell》(更新中)

1.用awk命令实现一个词频统计。假设文件名“data”,文件内容:ABCDACDDBCC1.1.python实现因为不熟悉awk命令,当时用python实现的:res_dict={}withopen('./data','r',encoding='utf-8')asfp:forlineinfp:foriteminlin

热文推荐