1.图(GRAPH)的定义:是一种非线性数据结构,由有穷、非空的点集V(G)和边集E(G)组成。当G中的每条边有方向时,称G为有向图,有向边(用一对尖括号<a,b>)又称为弧,起始顶点被称为弧尾,终止顶点被称为弧头,每条边无方向时(用一对括号表示(a,b)和(b,a)一样),被称为无向图。
2.顶点的度
连接顶点的边的数量称为该顶点的度。顶点的度在有向图和无向图中具有不同的表示。对于无向图,一个顶点V的度比较简单,其是连接该顶点的边的数量,记为D(V)。
对于有向图要稍复杂些,根据连接顶点V的边的方向性,一个顶点的度有入度和出度之分。
入度是以该顶点为端点的入边数量, 记为ID(V)。
出度是以该顶点为端点的出边数量, 记为OD(V)。
这样,有向图中,一个顶点V的总度便是入度和出度之和,即D(V) = ID(V) + OD(V)。
3.邻接顶点
邻接顶点是指图结构中一条边的两个顶点。 邻接顶点在有向图和无向图中具有不同的表示。对于无向图,邻接顶点比较简单。例如,在图二所示的无向图中,顶点V2和顶点V6互为邻接顶点,顶点V2和顶点V5互为邻接顶点等。
对于有向图要稍复杂些,根据连接顶点V的边的方向性,两个顶点分别称为起始顶点(起点或始点)和结束顶点(终点)。有向图的邻接顶点分为两类:
入边邻接顶点:连接该顶点的边中的起始顶点。例如,对于组成<V2,V6>这条边的两个顶点,V2是V6的入边邻接顶点。
出边邻接顶点:连接该顶点的边中的结束顶点。例如,对于组成<V2,V6>这条边的两个顶点,V6是V2的出边邻接顶点。
4.无向完全图
如果在一个无向图中, 每两个顶点之间都存在条边,那么这种图结构称为无向完全图。典型的无向完全图,如图四所示。
理论上可以证明,对于一个包含M个顶点的无向完全图,其总边数为M(M-1)/2。比如图四总边数就是5(5-1)/ 2 = 10。
5.有向完全图
如果在一个有向图中,每两个顶点之间都存在方向相反的两条边,那么这种图结构称为有向完全图。典型的有向完全图,如图五所示。
图五 有向完全图
理论上可以证明,对于一个包含N的顶点的有向完全图,其总的边数为N(N-1)。这是无向完全图的两倍,这个也很好理解,因为每两个顶点之间需要两条边。
6.权的概念:在一个图中,如果图的边具有一个与它相关的数,这个数就被称为该边的权,如果图中的每条边都具有权,这个带权图就被称为网络,简称网
- 对于一般无向图,顶点数为n,边数为e,则 0≤e ≤n(n-1)/2。
- 对于一般有向图,顶点数为n,弧数为e, 则 0≤e≤n(n-1) 。
7.路径概念:从一个顶点到另一定点的次序,被称为路径,对于无权图,沿路径所经过的边数被称为该路径的长度;对于有权图(网络),取沿路径各边的权之和作为此路径的长度;若路径中的顶点不重复出现,该路径为简单路径;起点和终点相同且长度不小于2的简单路径被称为简单回路或者简单环;
8.关于图的连通性: - 对于有向图,若存在一个顶点V,从该顶点有路径达到该图中其他的所有顶点时,称该有向图为有根图,V称为该图的根。若有向图中,不相同顶点V到U和U到V都存在路径,称V和U是强连通的,若图中任意两个顶点都是强连通的,成该图为强连通图;
- 对于无向图,若两个顶点V和顶点U有路径相通,则称V和U是连通的。若图中任意两个顶点都连通,则称G为连通图,否则为非连通图。无向图的连通分量就是其自身,非连通图有多个连通分量;
9.图的遍历:使用辅助数组 visit[N] 表示顶点是否被遍历过,若已经被访问置1,未被访问置0
DFS:深度优先搜索:
从图中某一顶点出发,访问后标记visit[i]为1,然后依次搜索第i个结点的领接点j,再依次搜索j结点的每个领接点,直到所有结点都被遍历
BFS:广度优先搜索
先被访问的结点,其领接点也先被访问,具有先进先出的特性,我们使用队列来保存已经访问过的结点,以确定被访问过结点的顶点领接点访问次序。
10.图的三种存储结构
-
邻接矩阵——表示顶点间相连关系的矩阵 设图G有n (n1) 个顶点,则邻接矩阵是一个n阶方阵。 当矩阵中的 [i,j]!=0(下标从1开始) ,代表其对应的第i个顶点与第j个顶点是连接的。
特点: -
无向图的邻接矩阵是对称矩阵,n个顶点的无向图需要n*(n+1)/2个空间大小
-
有向图的邻接矩阵不一定对称,n个顶点的有向图需要n²的存储空间
-
无向图中第i行的非零元素的个数为顶点Vi的度
-
有向图中第i行的非零元素的个数为顶点 Vi 的出度,第i列的非零元素的个数为顶点 Vi 的入度
邻接表
为图G中的每一个顶点建立一个单链表,每条链表的结点元素为与该顶点连接的顶点。
特点
- 无向图顶点 Vi 的度为第 i 个单链表中的结点数
- 无向图中 顶点 Vi 的出度为第 i 个单链表中的结点个数 顶点 Vi的入度为全部单链表中连接点域值是 i 的结点个数
- 逆邻接表:有向图中对每个结点建立以 Vi 为头的弧的单链表
邻接表与邻接矩阵的比较: