一、基本概念:
1、图(Graph):图G由两个集合组成:一个由顶点(vertex)构成的有穷非空集合和一个由边(edge)构成的有穷允空集合。
2、表示:
(1)顶点集:V(G)
(2)边集:E(G)
(3)图:G=(V,E)
3、无向图(undirected graph):表示边的两个顶点之间没有次序关系的图。
4、有向图(directed graph):表示边的顶点对有方向的图。<v0,v1>表示以顶点v0为尾(tail),以顶点v1为头(head)的边。
5、图的表示:
(1)无向图的边:(v1, v2)
(2)有向图的边:<v1, v2>
(3)无向图的表示:
V(G)={0, 1, 2, 3} E(G)={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)}
(4)有向图的表示:
V(G)={0,1,2} E(G)={<0,1>,<1,0>,<1,2>}
6、图的限制:
(1)图中不能有从顶点i到其自身的边,也就是说边(vi,vi)和<vi,vi>是不合法的。这样的边称为自身环(self loops)。
(2)同一条边在图中不能出现两次或两次以上。不满足这个限制的图称为多重图(multigraph)。
7、完全图(complete graph):是具有最多边数的图。
一个具有n个顶点的:
(1)无向图:边数的最大值 n(n-1)/2
(2)有向图:边数的最大值 n(n-1)
8、相邻(adjacent)、关联(incident):
(v0, v1)是无向图中的一条边,则称顶点v0和v1是相邻的,并称边(v0, v1)与顶点v0和v1关联。
9、邻接、关联:
<v0, v1>是有向图的一条边,则称顶点v0邻接到顶点v1,而称v1邻接于v0,并称边<v0, v1>与顶点v0和v1关联。
10、子图(subgraph):
是这样一个图G',G'满足
11、路径(path):从顶点Vp到Vq的一条路径是有顶点序列构成的边组成。
12、路径长度(length):路径上边的条数。
13、简单路径(simple path):路径上除了起点和终点可能相同外,其余顶点都互不相同。
无向图中可以用顶点序列来表示一条简单路径。
有向图中也可以用顺序顶点序列来表示一条简单有向路径。
14、回路或环路(cycle):是一条起点和终点相同的简单路径。
15、连通(connected):
(1)定义:在无向图中,如果从顶点V0到V1存在一条路径,则称顶点V0和V1是连通的。
(2)无向图连通:无向图中的每对顶点Vi和Vj,都存在一条从Vi到Vj的路径。
(3)联通分支(connected component):简称分支,是无向图中的极大连通子图。
(4)强连通(strongly connected)图:在有向图中,如果每对不同的顶点Vi和Vj,都存在从Vi到Vj以及从Vj到Vi的有向路径,则称有向图是强连通的。
(5)强连通分支(strongly connected component):是有向图的极大强连通子图。
16、顶点的度(degree):
(1)定义:是关联于该顶点的边的条数。
(2)入度(in-degree):在有向图中,以v为头(即箭头指向v)的边的条数。
(3)出度(out-degree):在有向图中,以v为尾的边的条数。
二、图的存储:
1、邻接矩阵(adjacency matrices)
假定G=(V,E)是一个包含(n>=1)个顶点的图,其邻接矩阵是一个n*n的二维数组。
例如:adj_mat,如果(Vi,Vj)是图G中的一条边,即(Vi,Vj)属于E(G),则adj_mat[i][j] = 1,如果不存在这样的边,则adj_mat[i][j] = 0。
(1)无向图的邻接矩阵一定是对称的。为了节省空间,无向图的邻接矩阵只需存储其上三角或下三角部分。
有向图的邻接矩阵不一定是对称的。
(2)顶点的度:
对于一个无向图,任意一个顶点i的度等于其邻接矩阵中顶点i所对应的行中的数字之和。
对于一个有向图,顶点i所对应的行中的数字之和等于顶点i的出度,而对应的列中的数字之和等于顶点i的入度。
(3)稀疏图(sparse graphs):边很少的图。
2、邻接表(adjacency lists)
(1)用n个链表代替邻接矩阵中n行。
(2)图G中的每个顶点对应一个链表。链表中的结点结构至少要包含一个顶点域和一个链域。
(3)对于任意给定的链表i(称为顶点i的邻接表),链表中的结点就是与顶点i相邻的所有顶点。每个链表都包含一个头结点,并且链表按照顶点序号的顺序排列。
(4)在无向图的邻接表存储表示中,通过对某个顶点的邻接表中的结点计数,可以得到该顶点的度。该值也是关联该顶点的边的条数。
(5)在有向图中,通过对某个顶点的链表中的结点计数,可以得到该顶点的出度。
(6)逆邻接表(inverse adjacency lists):
与邻接表相同:每个顶点都对应一个链表。
不同:逆邻接表中的每个链表存储的是邻接到(对应与邻接于)对应顶点的所有顶点。
下面是逆邻接表的结构,用来表示图中的一条边。
尾 | 头 | 头的列链 | 尾的行链 |
3、邻接多重表(adjacency multilists)
(1)在无向图的邻接表存储中,每一条边(Vi,Vj)都表示两项:一项在顶点Vi的邻接表中,而另一项在顶点Vj的邻接表中。某些时候,需要方便地找到第二项,并对已扫描的边作上标记。这时多重表结构将有利于这种操作。
(2)在多重表中,各链表中的结点可以被几个链表共享。图中的每一条边只对应于一个结点。而这个结点出现在该边所关联的两个顶点的每个邻接链表中。
marked | vertex1 | vertex2 | path1 | path2 |