零.前言
在前面,学习了链表和树。
在链表里,元素只有线性关系,每个元素一般只有一个前驱和后继。
在树中,元素之间有明显的层次关系,并且每一层上的元素可能和下一层的多个元素有关,但是只能和上一层的某一个元素有关。
而在图,我们结点间的关系是可以任意的,就好比一棵树,结点只有一个双亲,而图能拥有多个双亲。。。听起来怪怪的。。
一.术语
1.描述
顶点(Vertex)
:数据元素、
弧
:若V
表示顶点的有穷非空(树和链表可空哦)集合;VR
表示两个顶点的关系的集合。若<v,w>∈VR
,则<v,w>表示从v开始到w的一条弧
。
弧尾
:如弧定义中的v。
弧头
:如弧定义中的w。(有些奇怪,尾在前面,头在后面,理解成箭头就行惹)
有向图(Digraph)
:由顶点和弧构成的图。
边
:如果将弧的定义的有序对<v,w>
改为无序对(v,w)
,那么此时就为从v开始到w的一条边
。
无向图(Undigragph)
:由顶点和边构成的图。
2.完全图
在不考虑顶点回到其自身的弧或边,如果有:
1
2
n
(
n
−
1
)
\frac{1}{2}n(n-1)
21n(n−1)
条边的无向图,称为完全图
。
而有:
n
(
n
−
1
)
n(n-1)
n(n−1)
条边的图,叫有向完全图
至于如何推导这个算边的公式,那就是初中数学题了,不多说。
3.稀疏、稠密图
一般来说,有很少的边或弧:
<
n
l
o
g
n
<nlogn
<nlogn
我们叫做稀疏图
反之则为稠密图
4.子图
假设有两个图G=(V,{E})和G’=(V’,{E’}),若:
V
′
⊆
V
,
E
′
⊆
E
V'\subseteq V, E'\subseteq E
V′⊆V,E′⊆E
则可以说G’是G的子图
5.邻接与度
如果无向图G={V,{E}},如果边(v,v’)∈ E,则称顶点v和v’互为邻接点
。边(v,v’)依附
顶点v和v’, 或者说(v,v’)和顶点v、v’相关联
。
顶点v的度
是和v相关联边的数目,记为TD(V),例如该图的V3的度为3
有向图G=(V,{A})中,如果弧<v,v’>∈A,则顶点v邻接到顶点v’,顶点v’邻接自顶点v。以顶点v为头的弧的数目称为v的入度(InDegree)
,记为ID(v);同理,以顶点v为尾的弧的数目称为v的出度(OutDegree)
,记为OD(v)。顶点的度TD(v)=ID(v)+OD(v)
例如该图V1的 TD=3,ID=2,OD=1
一般来说,一个又n个顶点,e条边或弧的图,有一下规律:
e
=
1
2
∑
i
=
1
n
T
D
(
V
i
)
e = \frac{1}{2} \sum _ {i=1} ^nTD(V_i)
e=21i=1∑nTD(Vi)
6.路径与回环
无向图G=(V,{E})中从顶点v到顶点v’的路径
是一个顶点序列(v=vi,0,vi,1,… ,vi,m),其中(vi,j-1, vi,j)∈ E, 1≤j≤m。有向图同理。说了这么多,看起来很复杂,画个图就直观了:
第一个顶点和最后一个顶点相同的路径称为回路
或环
。
序列顶点不重复出现的路径叫简单路径
。除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,叫简单回路
或简单环
。
7.连通图与连通分量
在无向图中,从顶点v到顶点v’有路径,则v和v’是连通
的。如果对于图中任意两个顶点,他们都是连通的,那么这个图就是连通图
。
连通分量
,也叫做极大连通子图
:对于图G中的连通子图G’,如果不存在另一个连通子图G’’,使得G’⫋G’’,则G’是G的连通分量。所以G应该是所有连通分量的合集。
强连通图
,如果对于每一对vi,vj∈V,vi≠vj,则图G是强连通图。参考连通分量的定义,有向图也存在强连通分量
。
8.生成树
一个连通图的生成树
是一个极小连通子图,它包含该(子)图中的所有全部顶点,记定点数为n,那么它有且仅有n-1条边。如果再这个极小连通子图上添加一条边,那么必定会形成一个环。
所以,一个又n个顶点的生成树,有且仅有n-1条边,如果边>n-1,则必定有环;如果< n-1条边,则是非连通图。但是有n-1条边的图不一定是生成树
9.有向树和生成森林
如果一个有向图,恰有一个顶点的入度为0,其余顶点的出度均为1,则是一棵有向树
。一个有向图的生成森林
由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交
的有向树的弧。
二.图的储存结构
图的储存结构后面会详细讲,现在先说常见的几种:
- 数组表示法
- 邻接表
- 十字链表
- 领接多重表
三.图的遍历
这个后面也会讲,图的两种遍历深度优先搜索DFS
和广度优先搜索BFS