当前位置: 首页 > news >正文

邻接表储存图实现广度优先遍历(C++)

 目录

基本要求:

邻接表的结构体:

图的邻接表创建:

图的广度优先遍历(BFS):

邻接表的打印输出:

完整代码:

测试数据:

结果运行:

  通过给出的图的顶点和边的信息,构建无向图的邻接表存储结构。在此基础上,从A顶点开始,对无向图进行广度优先遍历,输出遍历序列。

基本要求:

(1)从测试数据读入顶点和边信息,建立无向图邻接表存储结构;

(2)把构建好的邻接表输入显示;

(3)从A顶点开始,编写BFS广度优先遍历算法;

(4)输出广度优先遍历序列。

邻接表的结构体:

typedef char VerTexType;
typedef struct Arcnode//边节点
{int adjvex;//该边所指向的顶点的位置struct Arcnode* nextarc;//指向下一条边的指针
}Arcnode;
typedef struct vnode//顶点节点
{VerTexType data;//顶点信息Arcnode* firstarc;//指向第一条依附该顶点的边的指针
}Vnode, AdjList[MVNum];
typedef struct//图
{AdjList vertices;//头顶点int vexnum, arcnum;//图当前顶点数和边数
}ALGraph;

图的邻接表创建:

bool CreateUDG(ALGraph& G)
{cin >> G.vexnum >> G.arcnum;//输入总顶点数,总边数for (int i = 0; i < G.vexnum; i++)//输入各点,构造表头结点表{cin >> G.vertices[i].data;//输入顶点值G.vertices[i].firstarc = NULL;//初始化表头节点指针域mp[G.vertices[i].data] = 0;//辅助数组,是否访问过该点,0表示没访问过}VerTexType v1, v2;for (int k = 0; k < G.arcnum; k++){cin >> v1 >> v2;//输入边相邻节点int i = LocateVex(G, v1);int j = LocateVex(G, v2);//确定v1,v2位置Arcnode* p1, * p2;p1 = new Arcnode;//生成一个新的边节点p1->adjvex = j;//邻节点序号为jp1->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc = p1;//将新节点插入顶点vi的边表头部p2 = new Arcnode;p2->adjvex = i;//邻接点序号为ip2->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc = p2;//将新节点插入顶点vj的表头部}return 1;
}

图的广度优先遍历(BFS):

void BFS(ALGraph& G,VerTexType u)
{cout<<”BFS序列:”<<endl;queue<VerTexType> q;q.push(u);while (!q.empty()){u = q.front();q.pop();int i = LocateVex(G, u);//取该点的位置if (!mp[G.vertices[i].data])//辅助数组,是否访问过{cout << G.vertices[i].data << " ";mp[G.vertices[i].data] = 1;}Arcnode* p;p = G.vertices[i].firstarc;while (p != NULL)//访问该头节点的链表{if (!mp[G.vertices[p->adjvex].data]){cout << G.vertices[p->adjvex].data << " ";mp[G.vertices[p->adjvex].data] = 1;q.push(G.vertices[p->adjvex].data);}p = p->nextarc;}}
}

邻接表的打印输出:

bool Print(ALGraph& G)
{cout << "邻接表:" << endl;for (int i = 0; i < G.vexnum; i++){cout << G.vertices[i].data << " ";Arcnode* p;p = G.vertices[i].firstarc;while (p != NULL){cout << G.vertices[p->adjvex].data << " ";p = p->nextarc;}cout << endl;}return 1;
}

完整代码:

#include<queue>
#include<map>
#define MVNum 100
using namespace std;
typedef char VerTexType;
map<VerTexType,int> mp;
typedef struct Arcnode//边节点
{int adjvex;//该边所指向的顶点的位置struct Arcnode* nextarc;//指向下一条边的指针
}Arcnode;
typedef struct vnode//顶点节点
{VerTexType data;//顶点信息Arcnode* firstarc;//指向第一条依附该顶点的边的指针
}Vnode, AdjList[MVNum];
typedef struct//图
{AdjList vertices;//头顶点int vexnum, arcnum;//图当前顶点数和边数
}ALGraph;
int LocateVex(ALGraph G, VerTexType u)//取该点位置
{for (int i = 0; i < G.vexnum; i++)if (u == G.vertices[i].data) return i;return -1;
}
bool CreateUDG(ALGraph& G)
{cin >> G.vexnum >> G.arcnum;//输入总顶点数,总边数for (int i = 0; i < G.vexnum; i++)//输入各点,构造表头结点表{cin >> G.vertices[i].data;//输入顶点值G.vertices[i].firstarc = NULL;//初始化表头节点指针域mp[G.vertices[i].data] = 0;}VerTexType v1, v2;for (int k = 0; k < G.arcnum; k++){cin >> v1 >> v2;//输入边相邻节点int i = LocateVex(G, v1);int j = LocateVex(G, v2);//确定v1,v2位置Arcnode* p1, * p2;p1 = new Arcnode;//生成一个新的边节点p1->adjvex = j;//邻节点序号为jp1->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc = p1;//将新节点插入顶点vi的边表头部p2 = new Arcnode;p2->adjvex = i;//邻接点序号为ip2->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc = p2;//将新节点插入顶点vj的表头部}return 1;
}
bool Print(ALGraph& G)
{cout << "邻接表:" << endl;for (int i = 0; i < G.vexnum; i++){cout << G.vertices[i].data << " ";Arcnode* p;p = G.vertices[i].firstarc;while (p != NULL){cout << G.vertices[p->adjvex].data << " ";p = p->nextarc;}cout << endl;}return 1;
}
void BFS(ALGraph& G,VerTexType u)
{cout<<”BFS序列:”<<endl;queue<VerTexType> q;q.push(u);while (!q.empty()){u = q.front();q.pop();int i = LocateVex(G, u);//取该点的位置if (!mp[G.vertices[i].data])//辅助数组,是否访问过{cout << G.vertices[i].data << " ";mp[G.vertices[i].data] = 1;}Arcnode* p;p = G.vertices[i].firstarc;while (p != NULL)//访问该头节点的链表{if (!mp[G.vertices[p->adjvex].data]){cout << G.vertices[p->adjvex].data << " ";mp[G.vertices[p->adjvex].data] = 1;q.push(G.vertices[p->adjvex].data);}p = p->nextarc;}}
}
int main()
{ALGraph G;CreateUDG(G);Print(G);BFS(G, 'A');//从A开始遍历
}

测试数据:

[测试数据]

12 16

A B C D E F G H I J K L

A D

B C

B D

B F

C F

D G

E B

E F

E G

E H

F I

G K

H I

I K

J K

K L

测试数据说明:

1.第一行两个整数分别表示无向图中的顶点数m和边数n;

2.第二行中的m个整数,表示m个顶点数据元素(数据类型为字符型;

3.从第三行开始连续n行数据,每一行两个字符表示无向图中的一条边关联的两个顶点数据信息。

4.无向图如下图示:

结果运行:

相关文章:

邻接表储存图实现广度优先遍历(C++)

目录 基本要求&#xff1a; 邻接表的结构体&#xff1a; 图的邻接表创建&#xff1a; 图的广度优先遍历&#xff08;BFS&#xff09;&#xff1a; 邻接表的打印输出&#xff1a; 完整代码&#xff1a; 测试数据&#xff1a; 结果运行&#xff1a; 通过给出的图的顶点和…...

解构赋值详解以及例子

以下是使用解构赋值的所有可能方式的示例代码&#xff1a; 数组解构赋值 const array [1, 2, 3];// 基本形式 const [a, b, c] array; console.log(a); // 1// 只获取部分值 const [, second] array; console.log(second); // 2// 设置默认值 const [d, e, f, g 4] arra…...

Spring Boot 3.0正式发布及新特性解读

目录 【1】Spring Boot 3.0正式发布及新特性依赖调整升级的关键变更支持 GraalVM 原生镜像 Spring Boot 最新支持版本Spring Boo 版本版本 3.1.5前置系统清单三方包升级 Ref 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; 【1】Spring Boo…...

【tgowt】更新thirdparty

更新完毕后是这样的 之前有过构建但是不能用在owt-p2p项目中,会有崩溃? 【tgowt】cmake转ninja vs构建现在好像都更新到108了 submodule比较麻烦 只修改这里的还不行:一旦git submodule init 后,再改这里的似乎晚了?如果能成功clone就有生成 还必须要改这里的 折腾好几次才…...

金字塔原理小节

目录 第1章 为什么要用金字塔结构 一、归类分组&#xff0c;将思想组织成金字塔 二、奇妙的数字“7” 三、归类分组搭建金字塔 四、找出逻辑关系&#xff0c;抽象概括 五、自上而下表达&#xff0c;结论先行 第1章 为什么要用金字塔结构 如果受众希望通过阅读你的文章、听…...

osg点云加载与渲染

目录 效果 laslib 关键代码 完整代码 效果 las点云读取使用了laslib这个库。 laslib 关键代码 {// 这里演示读取一个 .txt 点云文件const char* lasfile path.c_str();std::ifstream ifs;ifs.open(lasfile, std::ios::in | std::ios::binary);liblas::ReaderFactory f;libl…...

后端架构选择:构建安全强大的知识付费小程序平台

构建知识付费小程序平台需要考虑后端架构&#xff0c;确保系统安全性、性能和可扩展性。以下是一些常见的后端技术和最佳实践&#xff0c;能帮助您构建强大且安全的知识付费小程序平台。 1. 服务器端语言和框架选择 选择流行、成熟的后端语言和框架&#xff0c;如Node.js、P…...

第四节(2):修改WORD中表格数据的方案

《VBA信息获取与处理》教程(10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网…...

Qt中对Udp数据打包发送和接收

有些小伙伴对怎么对Udp的数据打包不太清楚。下面我举例说明。 比如我们要发送一个Person的数据。可以先用一个结构把Person的数据封装。 struct Person {QString name;int age; };下面是udp客户端和服务器端完整的代码例子。 #ifndef UDPCLIENT_H #define UDPCLIENT_H#includ…...

回调地狱 与 Promise(JavaScript)

目录捏 前言一、异步编程二、回调函数三、回调地狱四、Promise1. Promise 简介2. Promise 语法3. Promise 链式 五、总结 前言 想要学习Promise&#xff0c;我们首先要了解异步编程、回调函数、回调地狱三方面知识&#xff1a; 一、异步编程 异步编程技术使你的程序可以在执行一…...

【Android】UI开发中的一些小细节笔记

序言 本篇笔记用于记录在UI界面编写时的一些很简单但是可能一时想不起来的一些小的知识点。(持续更新…) 正文 TextView 1.当文字比较多&#xff0c;需要多行显示的时候&#xff0c;设置每行文字之间的上下的间距 android:lineSpacingExtra根据需要调整这个值设置行间距 …...

第十三章《搞懂算法:神经网络是怎么回事》笔记

目前神经网络技术受到追捧&#xff0c;一方面是由于数据传感设备、数据通信技术和数据存储技术 的成熟与完善&#xff0c;使得低成本采集和存储海量数据得以成为现实;另一方面则是由于计算能力的大幅提升&#xff0c;如图形处理器(Graphics Processing Unit&#xff0c;GPU)在神…...

SpringBoot不同环境加载不同配置文件(dev,sit,uat)

目录 一、springboot的profile配置profile多配置文件 二、maven的profiles策略 我们在使用spring的时候&#xff0c;一般都会有不同的环境需要部署&#xff1a;开发环境、测试环境和验收环境&#xff0c;而不同的环境则会有不同的配置&#xff0c;比如数据库ip。解决这个问题&a…...

2023.11.8 hadoop学习-概述,hdfs dfs的shell命令

目录 1.分布式和集群 2.Hadoop框架 3.版本更新 4.hadoop架构详解 5.页面访问端口 6.Hadoop-HDFS HDFS架构 HDFS副本 7.SHELL命令 8.启动hive服务 1.分布式和集群 分布式: 多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务)集 群:…...

Azure 机器学习 - 使用自动化机器学习训练计算机视觉模型的数据架构

目录 一、用于训练的数据架构图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 二、用于联机评分的数据架构输入格式输出格式图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 在线评分和可解释性 (XAI) 的数据格式支持…...

STM32F4X SDIO(九) 例程讲解-SD卡擦除、读写

STM32F4X SDIO &#xff08;九&#xff09; 例程讲解-SD卡擦除、读写 例程讲解-SD卡擦除、读写SD卡擦除CMD32:ERASE_WR_BLK_START命令发送命令响应 CMD33:ERASE_WR_BLK_END命令发送命令响应CMD38:ERASE命令响应 CMD13:SD_CMD_SEND_STATUS命令发送命令回应 SD卡读数据CMD16:SET_…...

【机器学习范式】监督学习,无监督学习,强化学习, 半监督学习,自监督学习,迁移学习,对比分析+详解与示例代码

目录 1. 监督学习 (Supervised Learning): 2. 无监督学习 (Unsupervised Learning): 3. 强化学习 (Reinforcement Learning): 4. 半监督学习 (Semi-Supervised Learning): 5. 自监督学习 (Self-Supervised Learning): 6. 迁移学习 (Transfer Learning): 7 机器学习范式应…...

JUC包下面的四大天王+线程池部分知识

一)Semphore:限流器用我就对了 Java中信号量Semphore是把操作系统原生的信号量封装了一下&#xff0c;本质就是一个计数器&#xff0c;描述了 可用资源的个数&#xff0c;主要涉及到两个操作 如果计数器为0了&#xff0c;继续Р操作&#xff0c;就会出现阻塞等待的情况 P操作:申…...

AGV系统控制位置管理功能

# ファイル: agv_locattion.py # 説明: AGV (Automated Guided Vehicle) の位置情報を管理し、UDPサーバーとして動作するGUIアプリケーションです。 # 必要なライブラリをインポート import tkinter as tk import socket import threading def AGV_handle_submit(canvas, st…...

JavaScript从入门到精通系列第三十三篇:详解正则表达式语法(二)

文章目录 一&#xff1a;正则表达式 1&#xff1a; 检查一个字符串中是否有. 2&#xff1a;第二种关键表达 3&#xff1a;第三种关键表达 ​编辑4&#xff1a;第四种关键表达 5&#xff1a;第五种关键表达 6&#xff1a;第六种关键表达 二&#xff1a;核心表达二 1&am…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...