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

news2024/11/18 8:48:57

 目录

基本要求:

邻接表的结构体:

图的邻接表创建:

图的广度优先遍历(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;//邻节点序号为j
		p1->nextarc = G.vertices[i].firstarc;
		G.vertices[i].firstarc = p1;//将新节点插入顶点vi的边表头部
		p2 = new Arcnode;
		p2->adjvex = i;//邻接点序号为i
		p2->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;//邻节点序号为j
		p1->nextarc = G.vertices[i].firstarc;
		G.vertices[i].firstarc = p1;//将新节点插入顶点vi的边表头部
		p2 = new Arcnode;
		p2->adjvex = i;//邻接点序号为i
		p2->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.无向图如下图示:

结果运行:

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

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

相关文章

归并排序 merge Sort + 图解 + 递归 / 非递归

归并排序(merge sort)的主要思想是&#xff1a;将若干个有序序列逐步归并&#xff0c;最终归并为一个有序序列二路归并排序(2-way merge sort)是归并排序中最简单的排序方法 &#xff08;1&#xff09;二路归并排序的递归实现 // 二路归并排序的递归实现 void merge(vector&l…

EFCore: The ConnectionString property has not been initialized.

使用NuGet的程序包管理控制台执行命令“update-database”的时候报出该错误 经过检查发现是optionsBuilder.UseSqlServer(strConn);中的strConn没有写

数据库01-慢查询优化

目录 MySQL优化 慢查询 如何定位慢查询&#xff1f; 如何分析慢查询&#xff1f; MySQL优化 MySQL 优化是数据库管理和应用性能调优的一个重要方面。以下是一些常规性的 MySQL 优化经验和适用场景&#xff1a; 索引优化&#xff1a; 确保表的字段上有适当的索引&#xff0…

计算机毕业设计选题推荐-农产品销售微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

C语言全部关键字解析

前言 C语言具有以下关键字&#xff1a; 这些关键字如下: 关键字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile 对于这些关键字&#xff0c;大…

牛客网刷题笔记131111 Python实现LRU+二叉树先中后序打印+SQL并列排序

从学校步入职场一年多&#xff0c;已经很久没刷过题了&#xff0c;为后续稍微做些提前的准备&#xff0c;还是重新开始刷刷题。 从未做过计划表&#xff0c;这回倒是做了个计划表&#xff0c;希望能坚持吧。 刷题比较随性且量级不大&#xff0c;今天就写了2个算法2个sql&#x…

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

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

Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法——使用布局、Spacer等控件

Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法—使用布局、Spacer等控件 Chapter1 Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法—使用布局、Spacer等控件Chapter2 Qt Creator中布局器详解01. 概述02. 开发环境03. 布局器概述04. 布局属性设置05. 弹簧条属性…

简单版本管理服务编写

说明: 制作android应用内更新的时候&#xff0c;经常会用到版本检查&#xff0c;下载&#xff0c;安装&#xff0c;这时候需要写一个版本管理服务。 本文说明了自己编写版本服务的简单经过。 解决方案: 该软件实现如下功能&#xff1a; 创建后台接口&#xff1a;版本软件上传…

基于PHP的设云尘资讯网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

保姆级自定义GPTs教程,无需任何代码!

11月10日&#xff0c;OpenAI正式宣布向所有ChatGPT Plus用户开放GPTs功能&#xff0c;一个人人都能开发自定义ChatGPT助手的时代降临。 GPTs支持无代码、可视化点击操作&#xff0c;这意味着即便你没有任何编程经验&#xff0c;只要有数据、脑洞大开的想法&#xff0c;就能开发…

探索微信小程序框架的精华——高质量的优秀选择

目录 引言&#xff1a; 1. 框架性能 2. 开发者工具支持 3. 文档和社区支持 4. 扩展能力 5. 使用率和稳定性 结语&#xff1a; 引言&#xff1a; 微信小程序作为一种轻量级、高效便捷的应用形式&#xff0c;已经在移动应用领域占据了重要地位。而其中&#xff0c;选择一个…

PostMan授权认证使用

Authorization 对于很多应用&#xff0c;出于安全考虑我们的接口并不希望对外公开。这个时候就需要使用授权(Authorization)机制。 授权过程验证您是否具有访问服务器所需数据的权限。 当发送请求时&#xff0c;通常必须包含参数&#xff0c;以确保请求具有访问和返回所需数据…

C/C++数据结构之链表题目答案与解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.题目…

C++学习笔记(二):C++是如何运行的

C是如何运行的 include 预处理语句&#xff0c;在编译前就会被处理。 main函数 程序入口。 #include <iostream>int main() {std::cout << "Hello World!" << std::endl;std::cin.get();return 0; }Visual Studio 解决方案平台指的是编译的代码的…

从零开始开发抖音小程序:与餐饮团购的完美融合

本文将探讨如何从零开始开发一个创新的抖音小程序&#xff0c;以其独特的特性与餐饮团购进行完美融合。 一、什么是抖音小程序&#xff1f; 抖音小程序为开发者提供了在用户观看视频时进行无缝体验的机会。通过借助抖音的庞大用户基础&#xff0c;开发者可以将自己的创意呈现给…

python3GUI--QQ音乐By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;展示0.播放页1.主界面1.精选2.有声电台3.排行4.歌手5.歌单 2.推荐3.视频1.视频2.分类3.视频分类 4.雷达5.我喜欢1.歌曲2.歌手 6.本地&下载7.最近播放8.歌单1.一般歌单2.自建歌单3.排行榜 9.其他1.搜索词推荐2.搜索结果 三&#x…

Vuex持久化插件

Vuex数据默认是存储在内存中的&#xff0c;当然我们也可以将它存储在Local Storage&#xff0c;也可以指定某些数据存储在Local Storage 这样我们就用到了Vuex持久化插件vuex-persistedstate 安装vuex-persistedstate插件 npm install vuex-persistedstate --save 案列&#x…

数据管理系统-week1-文件系统、数据库和数据库管理系统

文章目录 前言一、 文件系统文件系统的限制 二、 数据库系统三、 数据库管理系统参考文献 前言 一、 文件系统 对于更高级的数据处理应用程序来说&#xff0c;基于数据块的持久存储逻辑模型过于简单数据块序列被划分为称为文件的数据块的可变子序列&#xff0c;与文件相关的名…