数据结构(五):图

本文详细介绍了图的概念,包括无向图和有向图的区别,简单图和多重图的特征,以及完全图的定义。还涵盖了图的权、子图、连通性和遍历方法(深度优先遍历和广度优先遍历),并提到了最小生成树和最短路径的计算方法,如Prim算法和Dijkstra算法。最后,讨论了拓扑排序在项目工程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章仅仅用于巩固我复习图,写的不好的地方,欢迎大家指正。

图:

定义:

      在表中,数据元素是被串起来的,每个数据元素只有一个直接前驱和一个直接后继元素。在树中,数据元素有着明显的层次关系,并且每一层的数据元素都可能与下一层的多个元素有关,但是只能和上一层的一个数据元素相关。而图是一种更加复杂的数据结构,图的定义为:一个图G=(V,E)由顶点的集合V和边的集合E组成,每一条边就是一幅点对(v,w),其中v,w都属于V,有时候也会把边叫做弧。

补充概念:

  1. 在表中我们把数据元素叫做元素,在树中把数据元素叫做结点,那么在图中我们称数据元素为顶点。
  2. 在表中可以没有元素,叫做空表;在树中可以没有结点,叫做空树;但是在图中不允许没有顶点,顶点集合V有穷非空
  3. 图中任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集E可以为空。

各种图的定义:

无向图和有向图:

  • 无向图:先介绍一下无向边:若一个顶点vi到vj之间的边没有方向,则称这条边为无向边,用无序偶对(vi,vj)来表示,也可以写成(vj,vi)。如果在图中任意两个顶点之间的边都是无向边,则把该图称为无向图。
  • 有向图:也先介绍一下一下有向边:若一个顶点vi到vj之间的边有方向,则称这条边为有向边,也叫做弧。用有序偶<vi,vj>来表示,不能写反(与无向边的()不同的是,有向边用<>),其中vi叫做弧尾,vj叫做弧头。如果在图中任意两个顶点之间的边都是有向边,则把该图称为有向图。

简单图:

在图中,若不存在顶点到其自身的边,且两个顶点之间一条边不重复出现,则把这种图叫做简单图。

多重图:

若图中,若存在顶点到其自身的边,且两个顶点之间一条边重复出现,则把这种图叫做多重图。

完全图:

在无向图中,如果任意两个顶点之间都存在边的话,那么称该图为无向完全图。含有n个顶点的无向完全图它具有n*(n-1)/2条边。在有向图中,如果任意两个顶点之间都存在方向相反的两条弧的话,那么称该图为有向完全图。含有n个顶点的有向完全图它具有n*(n-1)条边。从这里也可以得出结论,对于具有n个顶点和e条边的图来说,无向图0<=e<=n*(n-1)/2,有向图0<=e<=n*(n-1)。

权:

在有些图中,它的边或者弧具有与它相关的数字,这种与图的边或者弧相关的数字叫做权,或者叫做它的权重。这些权可以表示从一个顶点到另一个顶点的距离或者耗费。而这种带权的图通常叫做

子图:

如果有两个图G=(V,E)和G1=(V1,E1),且V1是V的子集,E1是E的子集,则把G1叫做G的子图。

图中顶点和边的关系:

  • 对于无向图G=(V,E),如果边(v,v1)属于E,则称顶点v和v1互为邻接点,即v和v1相邻接。边(v,v1)依附于顶点v和v1,或者说边(v,v1)与顶点v和v1相关联。顶点的就是和顶点相关联的边的数目。(小知识:边数就是各顶点度数和的一半)
  • 对于有向图G=(V,E),如果弧<v,v1>属于E,则称顶点v邻接到顶点v1,即顶点v1邻接自顶点v。弧<v,v1>和顶点v和v1相关联。以顶点v为头的弧的数目叫做v的入度,记为ID(v);以v为尾的弧的数目叫做v的出度,记为OD(v);而一个顶点的度为入度加出度,记为TD=ID+OD。
  • 顶点v到顶点v1的路径是一个顶点序列,在有向图中,路径也是有向的,顶点序列应该满足边集,图中顶点到顶点之间的路径是不确定的。路径的长度是路径上的边或者弧的数目。
  • 第一个顶点和最后一个顶点相同的路径叫做回路或者叫做
  • 序列中顶点不重复出现的路径叫做简单路径;除了第一个顶点和最后一个顶点以外,其他的顶点都不重复出现的回路叫做简单回路或者简单环

连通图:

  • 在无向图中,如果从顶点v到顶点v1有路径,则称v和v1是连通的。如果对于图中任意两个顶点都是连通的,那么我们称这个无向图为连通图。
  • 无向图中的极大连通子图叫做连通分量。(连通分量:它强调要是子图;子图要是连通的;连通子图含有极大顶点数;具有极大顶点数的连通子图包含依附于这些顶点的所有边)
  • 在有向图中,任意两个顶点v,v1,从v到v1和从v1到v都存在路径,则称该有向图为强连通图。有向图中的极大强连通子图叫做有向图的强连通分量。
  • 一个连通图的生成树是一个极小的连通子图,它包含图中全部的n个顶点,但只有足有构成一棵树的n-1条边。
  • 如果一个有向图只有一个顶点的入度为0,其余顶点的入度都是1,则是一个有向树
  • 一个有向图的生成森林由若干棵有向树组成,它含有图中的所有顶点,但只要足以构成若干棵不相交的有向树的弧。

图的存储结构:

图的存储结构更加复杂,因为图是任意一个顶点都可以看成是第一个顶点,任意顶点的邻接点之间也不存在次序关系。

1.邻接矩阵:

考虑到图是由顶点组成,那就可以分成两个结构进行存储。顶点不分大小,主次,可以用一维数组来存储,而边是顶点和顶点之间的关系,可以用二维数组来存储。假设一个图有n个顶点,那么邻接矩阵就是一个n*n的方阵,定义为:arc[i][j]={1,若(vi,vj)属于E或者<vi,vj>属于E;0,其他}。

  • 无向图中,它的边数组是一个对称的矩阵(即从矩阵的左上角到右下角的主对角线为轴,右上角的元与左下角对应的元全都是相等的)。有了这个矩阵,那么就很容易判断无向图中的信息了,比如有无边;某个顶点的度(度就是这个顶点vi在邻接矩阵中第i行或者第i列的元素之和。
  • 有向图中,它的边数组不是一个对称的矩阵。因为二维数组是[行][列]的形式的,所以在选择方向的时候应该注意弧头弧尾(参考<弧尾,弧头>)。有向图讲究入度和出度,顶点vi的度是第i的各数之和;顶点vi的度是第i的各数之和。
  • 中,假设网有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:arc[i][j]={权值,若(vi,vj)属于E或者<vi,vj>属于E;0,若i==j;不存在权值时,其他}。

2.邻接表:

邻接矩阵是不错的一种图存储结构,但是对于边数相对顶点较少的图或者对于边特别少,这种结构是存在对存储空间的极大浪费的。邻接表的思路是数组链表相结合。处理方法如下:图中的顶点用一个一维数组存储,也可以用单链表存储,但是数组容易读取。同时在顶点数组中每个顶点还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。图中的每个顶点的所有的邻接点构成一个表,无向图称为顶点的边表,有向图则称为以该顶点作为弧尾的出边表,当然有时候为了方便还可以再建立一个以该顶点作为弧头的入边表

当然还有其他的存储结构比如:十字链表,邻接多重表,边集数组等。

图的遍历:

定义:

从图中某一个顶点出发访遍图中的其余顶点,且使每个顶点仅被访问一次,这个过程就叫做图的遍历。

深度优先遍历:

深度优先遍历,也叫做深度优先搜索,简称为DFS。有点类似于树的前序遍历,它从图中的某个顶点v出发,访问顶点v的未被访问的邻接点,然后再从v的未被访问的邻接点开始,找到该邻接点未被访问的邻接点进行访问。而每次访问过的邻接点都标注为已经访问了,直到没法再走为止,然后再退回,看是否存在没有访问的邻接点,有的话重复上述步骤,直到全部顶点都被访问了。深度优先遍历很适合递归实现。

广度优先遍历:

广度优先遍历,也叫做广度优先搜索,简称为BFS。有点类似于树的层序遍历,它从图中某顶点v出发,在访问了v之后依次再访问v的各个没有访问过的邻接点,然后再分别从这些邻接点出发依次访问它们的邻接点,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中还有顶点未被访问,则需要另选一个没有被访问过的顶点作为新的起始顶点,重复上述步骤,直至图中所有顶点都被访问到为止。广度优先遍历可以用一个队列实现。

深度优先遍历更适合目标比较明确,以找到目标为主要目的情况,而广度优先遍历更适合在不断扩大遍历范围时找到相对最优解的情况。

最小生成树:

定义:首先一个连通图的生成树是一个极小的连通子图,它包含图中全部的n个顶点,但只有足有构成一棵树的n-1条边。那么最小生成树就是构成连通网最小代价生成树。没错就是网,带有权值的图,所谓的最小代价就是n个顶点和n-1条边把一个连通图连接起来,还要使权值的和最小。

实现:

  1. 普里姆(Prim)算法
  2. 克鲁斯卡尔(Kruskal)算法

最短路径:

定义:在网图和非网图中,它们的最短路径的定义是不同的。在非网图中,最短路径为两个顶点之间经过的边数最少的路径;而在网图中,最短路径为两个顶点之间经过的边上权值之和最小的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。

实现:

  1. 迪杰斯特拉(Dijkstra)算法
  2. 弗洛伊德(Floyd)算法

拓扑排序:

定义:在一个表示项目工程的有向图中,用顶点表示活动(也可以叫做子工程),用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。注意:AOV网中的弧也表示活动之间存在某种制约关系且AOV网中是不能存在回路的。假设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2……vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必须在vj之前。那么这样的顶点序列为一个拓扑序列。而拓扑排序其实就是对一个有向图构造成拓扑序列的过程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值