化解数据结构----图的遍历和应用

简介: 化解数据结构----图的遍历和应用

网络异常,图片无法展示
|

📢📢📢📣📣📣 🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,多多关照😜😜😜 🏅🏅🏅Python领域优质创作者,欢迎大家找我合作学习(文末有名片欢迎+++) 💕 入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀 💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺 🍉🍉🍉“一万次悲伤,依然会有Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈 🌟🌟🌟✨✨✨

前言:💡💡💡在这个[有趣的的数据结构和算法]专栏中,Dream将带大家以手写笔记和知识梳理的形式带大家讲解每一个知识点,将数据结构轻松化解! 💗 💗 💗每周一篇,喜欢的话欢迎订阅起来吧~ ps:这是C语言版的嗷 图知识框架:

网络异常,图片无法展示
|

@TOC

一、图的定义和基本术语

1.图的定义

图: 简单的说,图是一个用线或边连接在一起的顶点或节点的集合,严格的说,图是有限顶点V和边E的有序对。 图的表示:一般使用圆圈表示顶点,使用线段表示边,一条边连接两个不同的顶点。有些边是带方向的称为有向边,当顶点v到u含有一条有向边,就画一个箭头从v指向u,使用元组<v,u>表示;而没有方向的边称为无向边,当顶点v到u含有一条有向边,就画一条线段从v指向u,使用元组(v,u)表示。例如下面分别是有向图和无向图。

网络异常,图片无法展示
|
网络异常,图片无法展示
|

图根据边的分类分为有向图和无向图

  1. 有向图的边是有向边,它就像公路的单行道一样,只能从一个方向到另一个方向
  2. 无向图的边是无向边,当然它就像双向车道一样可以互相到达,而且两个顶点是没有区别的。

当且仅当(u,v)是图的边,称顶点v和u是邻接的。边(u,v)关联于顶点u和v。对于无向图这种邻接和关联是对等的,而有向图是单向的,它仅仅从u到v。

无向边用小括号()表示,有向边用尖括号<>表示。

2.图的基本术语

2.1子图

如果图H的顶点和边的集合是图G的子集,那么称图H是图G的子图。

网络异常,图片无法展示
|

2.2 无向完全图和有向完全图

任意两点间都存在边使其相连的无向图或任意两点间都存在两条不同边的有向图称作完全图

N个顶点的完全图:

  • 有向 有n(n-1)条边 无向 有n(n-1)/2条边

2.3稀疏图和稠密图

顾名思义,就是讨论多少的问题,注意分界点,这个依据是大家默认的一个依据,而不是必须的分界依据

网络异常,图片无法展示
|
数据结构中对于稀疏图的定义为:有很少条边或弧(边的条数|E|远小于|V|²)的图称为稀疏图(sparse graph),反之边的条数|E|接近|V|²,称为稠密图(dense graph)。此定义来自百度百科,实际上是一种朴素的理解,简单来说边越多,图就越稠密

2.4权和网

权: 在图的一些应用中,可能要为每条边赋予一个表示大小的值,这个值就称为权。例如从城市A到城市B存在一条公路,而可以使用权表示这条公路的距离。 那我们把**带权的图称为网**

2.5邻接点

网络异常,图片无法展示
|

2.6度、入度、出度

顶点的度为以该顶点为一个端点的边的数目。 对于无向图,顶点的边数为度,度数之和是顶点边数的两倍 对于有向图,入度是以顶点为终点,出度相反。有向图的全部顶点入度之和等于出度之和且等于边数。顶点的度等于入度与出度之和。

注意:入度与出度是针对有向图来说的。

网络异常,图片无法展示
|

2.7路径和路径长度

两顶点之间的路径指顶点之间经过的顶点序列,经过路径上边的数目称为路径长度。

2.8回路和环

第一个顶点和最后一个顶点相同的路径称为回路或者环

2.9简单路径、简单回路和简单环

顶点不重复出现的路径称为简单路径。 除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路或者简单环。

2.10连通、连通图和连通分量

无向图中,两顶点有路径存在,就称为连通的。若图中任意两顶点都连通,同此图为连通图无向图中的极大连通子图称为连通分量。

网络异常,图片无法展示
|

网络异常,图片无法展示
|

2.11强连通图和强连通分量

有向图中,两顶点两个方向都有路径,两顶点称为强连通若任一顶点都是强连通的,称为强连通。 有向图中极大强连通子图为有向图的强连通分量

2.12连通图的生成树

  • 连通图的生成树是包含图中全部顶点的一个极小连通子图若图中有n个顶点,则生成树有n-1条边。所以对于生成树而言,若砍去一条边,就会变成非连通图。
  • 一颗有n个顶点的生成树有且仅有n-1条边
  • 如果一个图n个顶点,边数多于n-1则说明其一定有环
  • n-1条边的图却不一定是生成树。

2.13有向树和生成森林

一个有向图的生成森林是由若干颗有向树组成的,含有图中的全部顶点,但只有足以构成若干棵不相交的有向树的弧。

网络异常,图片无法展示
|

二、图的类型定义

emmmm,😍😍😍你在期待哪种图呢😍😍😍…………………………………………

网络异常,图片无法展示
|
网络异常,图片无法展示
|

网络异常,图片无法展示
|

1.CreateGraph(*G,V,VR) //按照顶点集V合边弧集VR定义构造图G 2. DestroyGraph(*G) //销毁图G 3. LocateVex(G,u) //返回图G中顶点u的位置,若不存在,则返回其他信息 4.GetVex(G,v) //返回图G中顶点v的值 5.PutVex(G,v,value) //将图G中顶点v赋值value 6.FirstAdjVex(G,*v) //返回顶点v的一个邻接顶点,若无则返回空 7.NextAdjVex(G,v,w) //顶点w是顶点v的邻接顶点,返回顶点v相对于顶点w的下一个邻接顶点;若顶点w是顶点v的最后一个邻接顶点,则返回空 8.InsertVex(*G,v) //在图G种添加顶点v 9.DeleteVex(*G,v) //删除图G中顶点v及其相关的弧 10.InsertArc(*G,v,w) //在图G中添加弧<v,w>,如果是无向图,还要添加对称弧<w,v> 11.DeleteArc(*G,v,w) //在图G中删除弧<v,w>,如果是无向图,还要删除对称弧<w,v> 12.DFSTraverse(G) //对图G进行深度优先遍历 13.HFSTraverse(G) //对图G进行广度优先遍历

三、图的存储结构

1.邻接矩阵

所谓邻接矩阵存储结构就每个顶点用一个一维数组存储边的信息,这样所有点合起来就是用矩阵表示图中各顶点之间的邻接关系。所谓矩阵其实就是二维数组。

1.1无向图的邻接矩阵表示法

  1. 无向图的邻接矩阵是对称的;
  2. 顶点i的度 = 第i行(列)中1的个数

注意: 完全图的邻接矩阵中,对角元素为0,其余的为1

网络异常,图片无法展示
|

1.2有向图的邻接矩阵表示法

  1. 有向图的邻接矩阵可能是不对称的
  2. 顶点的出度 = 第i行元素之和
  3. 顶点的入度 = 第i列元素之和
  4. 顶点的度 = 第i行元素之和+第i列元素之和

网络异常,图片无法展示
|

1.3网的邻接矩阵表示法

网就是有权的图(路径上有数值,即有权重)

  • 有边或者有弧:权
  • 无边或者无弧:无穷
    网络异常,图片无法展示
    |

1.4邻接矩阵存储表示

两个数组分别存储顶点表邻接矩阵! C语言版:

int g[N][N];
int main() {
  int n, m; //n个点 m条边 
  scanf("%d%d", &n, &m);
  int u, v; //从u到v
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &u, &v);
    g[u][v] = 1; 
    //g[v][u] = 1;//无向图要建双边 
    //g[u][v] = w; //带权图
  } 
}

网络异常,图片无法展示
|

1.5采用邻接矩阵表示法创建无向网

网络异常,图片无法展示
|
步骤:

  1. 输入总顶点数和总边数
  2. 依次输入点的信息存入顶点表中
  3. 初始化邻接矩阵,使每个权值初始化为最大值
  4. 构造邻接矩阵
    网络异常,图片无法展示
    |
    代码实现:
    网络异常,图片无法展示
    |

网络异常,图片无法展示
|

1.6邻接矩阵好处

  1. 直观、简单、好理解
  2. 方便检查任意一对顶点间是否存在边
  3. 方便找任意一项的所有邻接点
  4. 方便计算度
    网络异常,图片无法展示
    |

1.7邻接矩阵坏处

  1. 不便于增加和删除顶点
  2. 浪费空间,对稀疏图而言
  3. 浪费时间
    网络异常,图片无法展示
    |

2.邻接表

2.1邻接表表示法(链式)

  • 头结点data:存储顶点
  • 表结点 邻接点域adjvex:存储相连的顶点的序号,从0开始
  • 表结点 链域nextarc:指示下一条边或者弧
    网络异常,图片无法展示
    |
    无向图:
  1. 邻接表不唯一(表结点位置可以互换)
  2. 无向图中有n个顶点、e条边,则其邻接表需n个头结点和2e个表结点。适合存储稀疏图。
  3. 无向图中的顶点vi的度为第i个单链表中的结点数。
    网络异常,图片无法展示
    |

有向图: 1.邻接表

  • 找出度(vi的出度是第i个单链表中结点的个数)易,找入度(vi的入度为整个单链表中邻接点域值是i-1的结点个数)难;

2.逆邻接表

  • 同理 找入度易,找出度难

网络异常,图片无法展示
|

2.2图的邻接表存储形式

网络异常,图片无法展示
|

2.3邻接表的操作举例说明

网络异常,图片无法展示
|

2.4利用邻接表表示法创建无向网

网络异常,图片无法展示
|

2.5邻接表的特点

  • 方便找任一顶点的所有“邻接点”
  • 节约稀疏图的空间(·需要N个头指针+2E个结点(每个结点至少2个域))
  • 方便计算任一顶点的“度”:1.对无向图:是的 2.对有向图:只能计算“出度”;需要构造“逆邻接表”求入度
  • 不方便检查任意一对顶点间是否存在边
    网络异常,图片无法展示
    |

2.6邻接矩阵和邻接表表示法的关系

1.联系: 邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。 2.区别:

  • 对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。
  • 邻接矩阵的空间复杂度为O(n2),而邻接表的空间复杂度为O(n+e)。无向e,有向2e

3.用途: 邻接矩阵多用于稠密图;而邻接表多用于稀疏图

3.十字链表——用于有向图

网络异常,图片无法展示
|

十字链表(Orthogonal List)是有向图的另一种链式存储结构。 我们也可以把它看成是将有向图的邻接表和逆邻接表结合起来形成的一种链表。 有向图中的每一条弧对应十字链表中的一个弧结点,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点

网络异常,图片无法展示
|
顶点结点:

  • firstin:第一条入弧
  • firstout:第一条出弧

弧结点:

  • tailvex:弧尾位置
  • headvex:弧头位置
  • hilnk:弧头相同的下一条弧
  • tlink:弧尾相同的下一条弧

网络异常,图片无法展示
|

4.邻接多重表(无向图的另一种链式存储结构)

邻接表优点: 容易求得顶点和边的信息。 缺点: 某些操作不方便(如:删除一条边需找表示此边的两个结点)

结点3:与前面的相关联的 结点5:与后面的相关联的

网络异常,图片无法展示
|

🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了 ❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~

网络异常,图片无法展示
|
网络异常,图片无法展示
|

目录
相关文章
|
3月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
58 1
|
3月前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
101 4
|
11天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
35 2
|
3月前
|
机器学习/深度学习 存储 人工智能
数据结构在实际开发中的广泛应用
【10月更文挑战第20天】数据结构是软件开发的基础,它们贯穿于各种应用场景中,为解决实际问题提供了有力的支持。不同的数据结构具有不同的特点和优势,开发者需要根据具体需求选择合适的数据结构,以实现高效、可靠的程序设计。
245 63
|
11天前
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
26 0
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
87 5
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
80 1
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
55 5
|
4月前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
|
4月前
|
存储 Java
【数据结构】优先级队列(堆)从实现到应用详解
本文介绍了优先级队列的概念及其底层数据结构——堆。优先级队列根据元素的优先级而非插入顺序进行出队操作。JDK1.8中的`PriorityQueue`使用堆实现,堆分为大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆则相反。文章详细讲解了如何通过数组模拟实现堆,并提供了创建、插入、删除以及获取堆顶元素的具体步骤。此外,还介绍了堆排序及解决Top K问题的应用,并展示了Java中`PriorityQueue`的基本用法和注意事项。
76 5
【数据结构】优先级队列(堆)从实现到应用详解

热门文章

最新文章