数据结构--图(Graph)

news2024/11/27 21:40:09

定义

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成的一种非线性表结构,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

  • 顶点(vertex):图中的元素。
  • 边(edge):图中的顶点与其他任意顶点建立连接的关系。
  • 度(degree):跟顶点相连接的边的条数。
  • 入度(In-dedree):以该顶点为终点的边的条数。
  • 出度(Out-degree):以该顶点为起点的边的条数。

完全图

无向完全图

在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。

含有n个顶点的无向完全图有n×(n-1)/2条边

有向完全图

在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。

含有n个顶点的有向完全图有n×(n-1)条边

连通图

如果从顶点v到顶点w之间有路径,则称顶点v和w连通。

连通图一般都是指无向图。

顶点数为n的连通图,至少有n-1条边。

强连通图

在有向图中,若从顶点v到w有路径,则称这两个顶点强连通。若任意一对顶点都是强连通的,称此图为强连通图。

顶点数为n的强连通图,最少有n条边。

图的表示

邻接矩阵

图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边信息。

无向图

有向图

使用邻接矩阵的存储方式比较简单、直接,且可以高效的获取两个顶点的关系;但是由于存在n个顶点的图需要n*n个数组元素进行存储,当图为稀疏图时,使用邻接矩阵存储方法将会出现大量0元素,这会造成极大的空间浪费。这时,可以考虑使用邻接表表示法来存储图中的数据。

邻接表

图的顶点对应一条链表,链表中存储的是与这个顶点相连接的其他顶点。

邻接表存储起来比较节省空间,但是使用起来就比较耗时间。

当链表过长,为了提高查找效率,我们可以将链表换成其他更加高效的数据结构,如平衡二叉树(红黑树)、跳表、散列表等。

图的深度优先遍历

图的深度优先遍历,类似于树的先序遍历,主要思想是首先选择一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。

以无向图为例,深度优先搜索的算法步骤。

  1. 选择起始节点 u,并将其标记为已访问。
  2. 遍历当前节点 u 的所有未访问邻接节点。
  3. 对每个未访问的邻接节点 v,从节点 v 出发继续进行深度优先搜索(递归)。
  4. 如果节点 u 没有未访问的相邻节点,回溯到上一个节点,继续搜索其他路径。
  5. 重复 2∼4 步骤,直到遍历完整个图或找到目标节点为止。

//递归实现
void DfsRecursive(int v)
{
	cout<<v<<" ";
    //将v标记为已读
	visited[v] = true;

	for (int i = 0; i < vertexNum; i++)
	{
        //选择一个没有被标记过的节点
		if ((arc[v][i] != 0 && arc[v][i] != inf) && visited[i] == 0)
		{
			DfsRecursive(i);
		}
	}

}
//非递归
void DFS(int v) {
    stack<int> st;
    st.push(v); // 将起始顶点压入栈中

    visited[v]=true // 标记起始顶点为已访问

    while (!st.empty()) {
        v = stack.top();
        stack.pop();

        cout << v << " "; // 访问顶点v

        // 遍历顶点v的所有邻接点
        for (int i = 0; i < vertexNum; i++)
	    {
            //选择一个没有被标记过的节点
		    if ((arc[v][i] != 0 && arc[v][i] != inf) && visited[i] == false)
		    {
			    st.push(i);
		    }    
	    }
        
    }
}

 深度优先搜索的时间复杂度为 O(E),E 表示边的个数;空间复杂度为 O(V),V 表示顶点的个数。

图的广度优先遍历

广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问,然后顺序访问v的所有未被访问的邻接点 {vi,..,vj} ,并将其标记为已访问,然后将 {vi,...,vj} 中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。

步骤:

  1. 将起始节点u 放入队列中,并标记为已访问。
  2. 从队列中取出一个节点,访问它并将其所有的未访问邻接节点 v 放入队列中。
  3. 标记已访问的节点 v,以避免重复访问。
  4. 重复步骤 2∼3,直到队列为空或找到目标节点。
    void BFS(int v)
    {
    	queue<int> q;
    	q.push(v);
    	visited[v] = true;
    	while (!q.empty())
    	{
    		v = q.front();
            q.pop();
    		cout<<v<<" ";
    		for (int i = 0; i < vertexNum; i++)
    		{
    			if ((arc[v][i] !=0&&arc[v][i]!=inf) && visited[i] == false)
    			{
    				q.push(i);
    				visited[i] = true;
    			}
    		}
    
    	}
    	
    }

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

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

相关文章

three.js实现 加载3dtiles ,瓦片 ,倾斜摄影,功能

预览&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyexpand&idloadTiles 部署站点预览&#xff1a;http://threehub.cn/ 开源地址&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/e…

mp3和mp4的区别是什么?怎么把mp3转成mp4?(全)

在生活中我们或多或少会听到“mp3”和“mp4”&#xff0c;那么什么是mp3和mp4呢&#xff1f;mp3和mp4的区别是什么&#xff1f;mp3是一种音频压缩技术&#xff0c;旨在在不显著牺牲音质的前提下减小音频文件的体积&#xff0c;使其适用于音乐和其他音频内容的存储与传输。相比之…

压测时,并发量过高时,响应时间出现尖刺

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++STL~~vector

文章目录 一、vector的概念二、vector的使用三、vector 迭代器失效问题四、vector的练习五、总结 一、vector的概念 vector是一个功能强大的模板类&#xff0c;用于表示动态数组。 动态大小调整&#xff1a; std::vector可以根据需要自动增长或收缩其存储的元素数量。这意味着…

tyut-数据库期末复习要点

第一章 数据库系统&#xff08;DBS&#xff09;是由数据库&#xff08;DB&#xff09;&#xff0c;数据库&#xff08;DBMS) &#xff0c;应用程序和数据库管理员 (DBA)组成的存储&#xff0c;管理&#xff0c;处理和维护数据的系统 数据模型&#xff1a;比较真实的模拟现实世…

如和写一个库,并发布,我的colorfontcolor产生使用

闲来无事&#xff0c;写了一个npm包 1.1.2版本以后可以使用&#xff0c;前面的版本都是bug colorfontcolor 具体使用具体实现出现的细节出现的问题 写包时出现的问题用的相关库问题 具体使用 npm i colorontcolor //es6环境,vue组件中使用 <template><div><h1 …

交通流量预测,模型优化

交通流量预测&#xff0c;时空预测 模型优化&#xff0c;网络搭建 时间序列预测、车辆轨迹预测 行人轨迹预测建模 深度学习模型为rnn,lstm,gru,s2s,transformer,diffusion等各大顶会sota方法 个人在做&#xff0c;可加急 保质保量&#xff0c;售后无忧

06、Redis实战:优惠券秒杀、分布式锁Redission、可重入、重试、看门狗、MutiLock

5、分布式锁-redission 5.1 分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题 重入问题是指获取锁的线程&#xff0c;可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;例如在HashTable这样的代…

【赵渝强老师】执行MySQL的冷备份与冷恢复

冷备份是指发生在数据库已经正常关闭的情况下进行的备份。由于此时数据库已经关闭&#xff0c;通过冷备份可以将数据库的关键性文件拷贝到另外存储位置。冷备份因为只是拷贝文件&#xff0c;因此备份的速度非常快。在执行恢复时&#xff0c;只需将文件再拷贝回去就可以很容易恢…

Vxe UI vue vxe-table 常用功能使用分享

Vxe UI vue vxe-table 常用功能使用分享 表格需求 如果你需要的是一个能够渲染简单场景的表格&#xff0c;那么使用主流 UI 库就够了&#xff0c;例如element ui自带的表格等。 如果你需要是一个能同时满足简单场景以及各类复杂场景、大数量的全功能表格&#xff0c;那么推荐…

YOLOv5改进 | 融合改进 | C3 融合Dilated Reparam Block提升检测效果【附代码+小白可上手】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

电脑照片删除了怎么恢复回来?轻松三步,找回珍贵记忆

在数字时代&#xff0c;我们的电脑里储存了无数珍贵的照片&#xff0c;它们记录着生活的点滴&#xff0c;承载着美好的回忆。然而&#xff0c;一不小心将照片删除&#xff0c;往往会让人心急如焚。别担心&#xff0c;本文将为你详细介绍如何恢复电脑中被删除的照片&#xff0c;…

制造企业WMS库存盘点的应用

1.库存盘点的重要性与挑战 1.1 盘点目的与意义 库存盘点是制造工厂WMS系统中的一项基础性工作&#xff0c;其目的在于确保库存数据的准确性&#xff0c;从而为生产计划、物料需求计划、成本核算等提供可靠的数据支持。盘点的意义主要体现在以下几个方面&#xff1a; - 确保数…

PYUSD跃升为第六大稳定币:借势Solana和高APY的成功之道

随着加密市场的不断发展&#xff0c;稳定币在数字资产生态系统中的重要性日益凸显。PayPal旗下的美元稳定币PYUSD凭借强大的市场背景和策略性扩展&#xff0c;已经迅速成长为第六大稳定币。特别是在与Solana区块链的深度合作&#xff0c;以及高APY&#xff08;年化收益率&#…

数据可视化~~看板的切换设置+光滑折线图

目录 1.问题背景 2.安装模块 3.绘制柱状图的实现 4.对于图表的完善 5.重新思索 1.问题背景 我们想要通过这个用户的获得点赞的数量和她的粉丝数量的比值作为一个指标&#xff0c;我们想要绘制一个柱状图取值管的进行这个排名&#xff1b; 下面的这个是今天最后我们实现的…

飞睿智能10km无人机WiFi中继图传模块,视界无界,高速传输画质高清不卡顿、抗干扰

在无人机技术日新月异的今天&#xff0c;我们时常被那些高空翱翔的“小眼睛”所震撼。它们不仅为我们带来了未有的视觉体验&#xff0c;更在诸多领域发挥着举足轻重的作用。然而&#xff0c;要让无人机真正发挥其潜力&#xff0c;一个稳定、高效的图传系统至关重要。今天&#…

vue2 动态组件

文章目录 实现思路&#xff1a;组件注册动态组件嵌入的位置动态的tabPanes动态组件 - listComponent实际嵌入的组件 - invoiceListComponent 实现思路&#xff1a; 组件注册 组件的地址存储在表中&#xff0c;在xxx_components表中配置组件url components_key&#xff1a;组…

2024年最新股指期货交易手续费标准是多少?

股指期货交易手续费是指投资者在进行股指期货买卖时需要支付的费用&#xff0c;主要包括开仓手续费和平仓手续费。这些费用是交易所和期货公司为了维持市场运行和提供服务而收取的。 一、沪深300、上证50、中证500、中证1000股指期货手续费 日内交易&#xff1a;只要你在交易…

计算机中的「null」怎么读?

今天咱们来聊一个让无数程序员纠结的问题&#xff1a;“null”这个词到底该怎么读&#xff1f; 在开始讨论这个问题之前&#xff0c;我觉得有必要先带大家回忆一下我们曾经踩过的那些发音雷区。 尤其是那些英文术语&#xff0c;真的是一个坑接一个。比如这些常见的发音错误&am…

常见DDoS攻击之零日漏洞Zero-day Attacks

目录 一、什么是零日漏洞Zero-day Attacks 二、零日漏洞是如何转化为零日攻击的 三、常见的零日攻击类型 四、为什么零日攻击很危险 五、著名的零日攻击事件 六、如何降低零日攻击的风险 七、DDoS攻击防御解决方案&#xff08;定制化&#xff09; 7.1 产品优势 7.2 产品…