图(Graph)是一种比线性结构和树形结构都要复杂的数据结构。简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成。其中,数据元素常称作顶点(vertex),数据之间的关系常称作边(edge)。故图可记为G=<V,E>,其中V是顶点的有穷非空集合,E是边的集合。在图中顶点的前驱和后继是不设限制的,因此图描述的是一种网状关系。
若边是无序的或者说是无向的,则称此图是无向图。若无向图中有边(vi,vj)(无向图中边用圆括号表示),则显然(vj,vi)和(vi,vj)是同一条边。
若边是有序的或者说是有向的,则称此图是有向图。若有向图中有边<vi,vj>(有向图中边用尖括号表示),则显然<vj,vi>和<vi,vj>不是同一条边。有向图中的边也称为弧(arc),对于弧<vi,vj>,vi是弧尾(边的起点),vj是弧头(边的终点)。
无向图 G1=<V1,E1> V1={v0,v1,v2,v3,v4} E1={(v0,v1),(v0,v2),(v1,v3),(v2,v3),(v2,v4),(v3,v4)}
有向图 G2=<V2,E2> V2={v0,v1,v2,v3} E2={<v0,v1>,<v0,v2>,<v2,v0>,<v2,v3>,<v3,v0>}
所谓的图的存储,主要是想从存储结构中表达各顶点之间的联系,也就是表现图中的边。因为顶点总是很好存储的,如最常见的一维数组存储边:
顶点
v0 | v1 | v2 | v3 | v4 |
或者是
A | B | C | D | E |
邻接矩阵(adjacency matrix)和邻接表(adjacency list)是图的两种常见存储方式。
如上,无向图G1,对于顶点Vi和顶点Vj,若有边,则(Vi,Vj)=1,否则(Vi,Vj)=0。显然(Vi,Vi)=0,此时的邻接矩阵如下:
V0 | V1 | V2 | V3 | V4 | |
V0 | 0 | 1 | 1 | 0 | 0 |
V1 | 1 | 0 | 0 | 1 | 0 |
V2 | 1 | 0 | 0 | 1 | 1 |
V3 | 0 | 1 | 1 | 0 | 1 |
V4 | 0 | 0 | 1 | 1 | 0 |
显然,由于是无向图,该矩阵是对称的。邻接矩阵所需的存储空间的大小与边数无关,而与顶点数有关。它所需的空间复杂度是O(n^2),n是顶点数。
同样的,若是使用邻接表来存储无向图G1,邻接表如下:
邻接表实质就是链式存储。
对于有权图,在邻接矩阵中只需把1改为为相应的权值即可,在邻接表中顶点结构体则需添加成员表示权值。
转载请注明出处,本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/37915329
若有所帮助,顶一个哦!
专栏目录: