图
图由顶点的集合和边的集合组成。表示一些事物或者状态的表达方法。

顶点表示对象。边表示两个对象间的关系。
分类
一个图的顶点对是有序的, 则可以称之为有向图。在对有向图中的顶点对排序后, 便可以在两
个顶点之间绘制一个箭头。 有向图表明了顶点的流向。

边没有指向性的图叫做无向图。

可以为边赋予权值,来量化两个点之间的一些关系。边上带有权重的图叫做带权图。

顶点的度
无向图中顶点的度表示以该顶点作为一个端点的边的数目。
对于有向图,顶点度分为出度和入度。入度表示以该顶点为终点的入边数目,出度是以该顶点为起点的出边数目,该顶点的度等于其入度和出度之和。
不管是无向图还是有向图,顶点数n,边数e和顶点的度数有如下关系:
e = 1 2 Σ i = 1 n D ( V i ) e=\frac{1}{2}\Sigma_{i=1}^{n}{D(V_i)} e=21Σi=1nD(Vi)
相关术语
简单图:在图结构中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。
无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n*(n-1)/2条边。
有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。含有n个顶点的有向完全图有n*(n-1)条边。
对于无向图,如果两个点之间有边连接,则称两个顶点互为邻接点(Adjacent),即两顶点相邻接。
在无向图G中,如果从顶点V1到顶点V2有路径,则称V1和V2是连通的,如果对于图中任意两个顶点Vi和Vj都是连通的,则称G是连通图。

没有圈的连通图叫做树。没有圈的非连通图叫做森林。一棵树的边数等于顶点数减去一。反之,边数等于顶点数减去一的连通图是一棵树。
在有向图G中,如果对于每一对Vi到Vj都存在路径,则称G是强连通图。下图左侧并不是强连通图,右侧是。

没有圈的有向图叫做DAG(有向无环图)。
图的表示
邻接矩阵
邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
无向图

| - | A | B | C | D |
|---|---|---|---|---|
| A | 0 | 1 | 0 | 1 |
| B | 1 | 0 | 1 | 1 |
| C | 0 | 1 | 0 | 0 |
| D | 1 | 1 | 0 | 0 |
无向图的邻接矩阵是一个对称矩阵(n阶矩阵的元满足a[i][j]=a[j]i)。
1表示两点间有边存在,0表示两点间没有边存在。
有向图

| - | A | B | C | D |
|---|---|---|---|---|
| A | 0 | 1 | 0 | 0 |
| B | 0 | 0 | 1 | 1 |
| C | 0 | 1 | 0 | 0 |
| D | 1 | 0 | 0 | 0 |
网
每条边上带有权的图就叫网。

| - | A | B | C | D |
|---|---|---|---|---|
| A | 0 | 2 | ∞ | ∞ |
| B | ∞ | 0 | 7 | 3 |
| C | ∞ | ∞ | 0 | ∞ |
| D | 4 | ∞ | ∞ | 0 |
∞表示两点间不可达。
邻接表
图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以选择用单链表来存储。


深度优先搜索(DFS)
深度优先搜索(DFS)是用于遍历或搜索图数据结构的算法,该算法从根节点开始(图搜索时可选择任意节点作为根节点)沿着每个分支进行搜索,分支搜索结束后在进行回溯。在进入下一节点之前,树的搜索尽可能的加深。
DFS的搜索算法如下(以二叉树为例):
- 假定根节点(图的任意节点可作为根节点)标记为N,
- (L) : 递归遍历左子树,并在节点N结束。
- ®: 递归遍历右子树,并在节点N结束。
- (N): 访问节点N。
这些步骤可以以任意次序排列(先序遍历 中序遍历 后序遍历)。
例子
广度优先搜索(BFS)
树或图形的访问也可以按照节点所处的级别进行遍历。在每次访问下一层级节点之前,遍历所在高层级的所有节点。BFS从根节点(图的任意节点可作为根节点)出发,在移动到下一节点之前访问所有相同深度水平的相邻节点。
本文详细介绍了图数据结构的基础知识,包括图的分类(有向图、无向图、带权图)、顶点的度、相关术语如简单图、完全图等。还探讨了图的两种常见表示方法——邻接矩阵和邻接表。接着,深入讨论了深度优先搜索(DFS)和广度优先搜索(BFS)算法,并提供了实例题目链接。

被折叠的 条评论
为什么被折叠?



