[数据结构] 图---图的邻接矩阵存储方式模拟实现,包括BFS广度优先遍历和DFS深度优先遍历(上)

news2024/9/22 7:26:47

图的邻接矩阵存储

  • 1)邻接矩阵表示法
    • 相关概念
    • 实现基础框架
      • Graph_matrix
      • 构造函数
    • 实现基础操作
      • 获取某一顶点的下标
      • 添加边
      • 打印邻接矩阵
  • 2)BFS广度优先遍历
  • 3)DFS深度优先遍历
  • 4)最小生成树之克鲁斯卡尔算法
  • 5)最小生成树之普里姆算法
  • 6)单源最短路径之迪杰斯特拉算法
  • 7)单源最短路径之贝尔曼福特算法
  • 8)多源最短路径之弗洛伊德算法

1)邻接矩阵表示法

相关概念

  • 如下图所示:适合存储稠密图,==O(1)==时间复杂度内判断两个顶点间的连接关系,并得到权值
    邻接矩阵

实现基础框架

Graph_matrix

template <class V, class W, W MAX_W=INT_MAX, bool Direction = false>
//模板参数依次为:顶点、权重、是否有向
struct Graph_matrix{
public:
	Graph_matrix() = default;
private:
	vector<V> _vertex;
	unordered_map<V, int> _indexMap;  //顶点与下标的映射关系
	vector<vector<W>> _matrix;  //用顶点下标表示边的关系
};

构造函数

  • 初始化_vertex顶点表,并记录顶点与下标的映射关系;初始化_matrix边矩阵
Graph_matrix(const V* _array, size_t n){
		//初始化_vertex,记录各顶点与下标的映射关系
		_vertex.reserve(n);
		for (size_t i = 0; i < n; i++){
			_vertex.push_back(_array[i]);
			_indexMap[_array[i]] = i;
		}

		//初始化邻接矩阵
		_matrix.resize(n);
		for (size_t i = 0; i < n; i++){
			_matrix[i].resize(n);
			for (size_t j = 0; j < n; j++){
				_matrix[i][j] = MAX_W;
			}
		}
	}

实现基础操作

获取某一顶点的下标

size_t getVertexIndex(const V& v){
		auto ret = _indexMap.find(v);
		if (ret != _indexMap.end()){
			return ret->second;
		}
		else{
			return -1;
		}
	}

添加边

void addEdge(const V& src, const V& dst, const W& w){
		int srcindex = getVertexIndex(src);
		int dstindex = getVertexIndex(dst);
		_matrix[srci][dsti] = w;
		//无向图要处理对称的地方
		if (Direction == false){
			_matrix[dsti][srci] = w;
		}
	}

打印邻接矩阵

void print(){
		for (auto e : _indexMap){
			cout << e.first << "->" << e.second << endl;
		}

		cout << "  ";
		for (size_t i = 0; i < _vertex.size(); i++){
			cout << i << " ";
		}
		cout << endl;

		for (size_t i = 0; i < _matrix.size(); i++){
			cout << i << " ";
			for (size_t j = 0; j < _matrix[0].size(); j++){
				if (_matrix[i][j] == MAX_W){
					cout << "* ";
				}
				else{
					cout << _matrix[i][j] << " ";
				}
			}
			cout << endl;
		}
	}

2)BFS广度优先遍历

  • 利用层次遍历 + 标记已访问过的顶点(已入队列)
	//从某一顶点开始广度优先搜索
	void BFS(const V& src){
		size_t n = _vertex.size();
		vector<bool> visited(n, false);  //标记访问过的顶点
		
		queue<V> qu;
		int srci = getVertexIndex(src);
		qu.push(srci);
		visited[srci] = true;

		while (!qu.empty()){
			int cur = qu.front();
			qu.pop();
			cout << cur << "-> ";
			for (size_t i = 0; i < n; i++){  //让src的邻接顶点依次入队
				if (_matrix[cur][i] != MAX_W && visited[i] == false){
					qu.push(i);
					visited[i] = true;
				}
			}
		}
	}

3)DFS深度优先遍历

  • 先访问src顶点并标记,然后找与src相邻且没有被访问过的顶点,递归
	//从某一顶点开始深度优先搜索
	void _DFS(int srci, vector<bool>& visited){
		size_t n = _vertex.size();

		cout << srci << "-> ";
		visited[srci] = true;

		//找与src相邻且没有被访问过的顶点,递归
		for (size_t i = 0; i < n; i++){
			if (_matrix[srci][i] != MAX_W && visited[i] == false){
				_DFS(i, visited);
			}
		}
	}
	
	void DFS(const V& src){
		int srci = getVertexIndex(src);
		vector<bool> visited(_vertex.size(), false);
		_DFS(srci, visited);
	}

4)最小生成树之克鲁斯卡尔算法

查看克鲁斯卡尔算法的代码实现

5)最小生成树之普里姆算法

查看普里姆算法的代码实现

6)单源最短路径之迪杰斯特拉算法

查看迪杰斯特拉算法的代码实现

7)单源最短路径之贝尔曼福特算法

查看贝尔曼福特算法的代码实现

8)多源最短路径之弗洛伊德算法

查看弗洛伊德算法的代码实现

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

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

相关文章

毕业设计opencv 图像识别 指纹识别 - python

文章目录0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测4 OpenCV5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往…

365天深度学习训练营-第6周:好莱坞明星识别

目录 一、前言 二、我的环境 三、代码实现 四、损失函数 1. binary_crossentropy&#xff08;对数损失函数&#xff09; 2. categorical_crossentropy&#xff08;多分类的对数损失函数&#xff09; 3. sparse_categorical_crossentropy&#xff08;稀疏性多分类的对数损…

关于编辑器QScintilla(Scintilla)词法分析器工作原理的分析(实现注释区分)

入门&#xff0c;首先看我这两篇博客&#xff1a;关于QScintilla库的入门大全https://biao2488890051.blog.csdn.net/article/details/126798996?spm1001.2014.3001.5502 正式开始&#xff0c;先来看看词法分析器和编辑器的关系&#xff1a; &#xff08;注意&#xff1a;如果…

李宏毅机器学习作业6-使用GAN生成动漫人物脸

理论部分参考&#xff1a;​李宏毅机器学习——对抗生成网络&#xff08;GAN&#xff09;_iwill323的博客-CSDN博客 目录 任务和数据集 评价方法 FID AFD (Anime face detection) rate DCGAN和WGAN 代码 导包 建立数据集 显示一些图片 模型设置 生成器 判别器 权…

火山引擎:数字化时代,如何给金融业注入“内容活水”?

数字化&#xff0c;已经成为中国经济的一架强劲发动机。 工业和信息化部统计显示&#xff0c;中国数字经济规模从2012年的11万亿元增长到2021年的超45万亿元&#xff0c;排名世界第二&#xff0c;数字经济占国内生产总值比重由21.6%提升至39.8%。 数据&#xff0c;是数字化的…

git可视化工具-idea插件使用

上一篇文章说了git的命令行操作&#xff0c;是不是还沉浸在命令行在指间跳跃的兴奋中&#xff0c;这一篇再说一说在idea中如何使用git&#xff0c;会让人更兴奋了&#xff0c;也许你会认为这会是最好用的方式的。我想说这只是最好用的方式之一。 1.功能入口 当我们在idea里想使…

键盘输入语句和位运算

键盘输入语句键盘输入语句案例&#xff1a;可以从控制台接收用户信息&#xff0c;【姓名&#xff0c;年龄&#xff0c;薪水】进制介绍案例&#xff1a;输出 二&#xff0c;十&#xff0c;八&#xff0c;十六进制的数据位运算原码、反码、补码位运算符java 中有 7 个位运算(&…

数字工业 弹性安全丨2022 Fortinet工业互联网安全发展峰会成功举办

随着数字化转型的持续推进&#xff0c;工业互联网的作用和地位日益加强。而 OT 安全作为工业互联网体系不可或缺的部分&#xff0c;虽然受到越来越多企业的关注&#xff0c;但仍然面临着多方面的挑战。11月16日&#xff0c;一年一度的 OT 安全盛会——2022 Fortinet工业互联网安…

算法设计与分析 SCAU11091 最优自然数分解问题(优先做)

11091 最优自然数分解问题&#xff08;优先做&#xff09; 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 问题描述&#xff1a;设n是一个正整数。 &#xff08;1&#xff09;现在将n分解为若干个互不相同的自然…

【毕业设计】电影评论情感分析 - GRU 深度学习

文章目录0 前言1 项目介绍2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学…

手机拍照模糊怎么办?拍摄低像素照片如何修复清晰?

相信有很多人在用手机拍摄照片时自认为应该非常精美&#xff0c;拍完后却发现它模糊不清&#xff01;最终遗憾地错过了精彩的瞬间&#xff0c;令人非常遗憾&#xff01;虽然手机不是专业的摄像机&#xff0c;拍摄时模糊在所难免。但是我们可以在前期尽量避免拍摄的照片模糊&…

感冒了吃抗生素有用吗?

点击蓝字 &#xff5c;关注我们 2023年《科学世界》杂志全年订阅现已开启。 现在订阅&#xff0c;立享7.5折&#xff0c;并赠送经典科普图书《从一到无穷大》。通过文末链接&#xff0c;即可登录“科学世界”微店订购。抗生素&#xff0c;简单地说就是杀死细菌的药物。更准确地…

从源码上看,RocketMQ 5.0 跟 RocketMQ 4.x相比增加了哪几个模块

今天来介绍一下 RocketMQ 5.0 源码上的变化。 RocketMQ 5.0 是一个里程碑式的版本&#xff0c;经历了近 5 年的打磨&#xff0c;代码变更达到 60%。 首先看一下源码中模块的变化&#xff0c;如下图&#xff1a; 从图中可以看到&#xff0c;RocketMQ 5.0 主要增加了 4 个模块儿…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园生活互助平台06qe4

对于即将毕业或者即将做课设的同学而言&#xff0c;由于经验的欠缺&#xff0c;面临的第一个难题就是选题&#xff0c;确定好题目之后便是开题报告&#xff0c;如果选题首先看自己学习那些技术&#xff0c;不同技术适合做不同的产品&#xff0c;比如自己会些简单的Java语言&…

DataScience:KNIME工具的简介、安装、使用方法之详细攻略

DataScience&#xff1a;KNIME工具的简介、安装、使用方法之详细攻略 目录 KNIME的简介—数据挖掘与分析工具 1、KNIME软件如何帮助您的数据分析? 1.1、Create 1.2、Productionize 2、KNIME Analytics Platform 3、KNIME Hub KNIME的安装 KNIME的使用方法 1、构建第一…

[附源码]java毕业设计领导干部听课评课管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【深入浅出Spring6】第四期——实例化Bean和Bean的生命周期

一、获取 Bean Spring 提供了多种实例化Bean的方式&#xff1a;【只是表现形式不同&#xff0c;底层都是通过构造方法创建对象的】 通过构造方法实例化 【最简单的方式直接声明bean】通过简单工厂模式实例化 【定义一个简单模式工厂&#xff0c;然后通过工厂的静态方法获得Bea…

P3205 [HNOI2010]合唱队

[HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果&#xff0c;作为 AAA 合唱队负责人的小 A 需要将合唱队的人根据他们的身高排出一个队形。假定合唱队一共 nnn 个人&#xff0c;第 iii 个人的身高为 hih_ihi​ 米&#xff08;1000≤hi≤20001000 \le h_i …

Java网络编程套接字

文章目录1、网络编程基础2、Socket套接字2.1 Java数据报套接字通信模型2.2 Java流式套接字通信模型2.3 Socket编程注意事项3、UDP数据报套接字编程4、TCP流式套接字编程1、网络编程基础 在没有网路之前&#xff0c;两个进程只能在同一主机上进行通信&#xff0c;但是无法跨距离…

【kubernetes篇】使用Nfs实现kubernetes持久化存储

引言 在kubernetes使用的过程中&#xff0c;有很多数据需要持久化保存。而kubernetes本身不能实现这样的功能&#xff0c;所以需要提供外部存储来实现。nfs网络文件系统&#xff0c;能良好支持pv动态创建等功能&#xff0c;是一个不错的持久化保存方式。今天将这一部分内容作以…