rambo

图论(一)图的邻接表存储

图(graph) G=(V,E)是由顶点(vertex)的集合V和边(edge,也称弧(arc))的集合E组成的。每一条边就是一个点对(v,w)。如果点对是有序的,则称为有向图(digraph)。顶点vw邻接(adjacent)当且仅当(v,w)\in E

wuxiang

邻接矩阵:用二维数组表示,对于每条边(v,w),置A[v][w]=true,否则数组的项为false。如果边有一个权,则可以置A[v][w]为该权。而使用一个很大或者很小的权作为标记表示不存在的边。空间需求为\Theta(\lvert V \rvert^{2})。如果图的边不是很多,那么这种表示方法代价比较大。若图是稠密的(dense),\lvert E \rvert=\Theta(\lvert V \rvert^{2}),则邻接矩阵是合适的表示方法。

邻接链表:一般的应用中,边的条数\lvert E \rvert远远小于\lvert V \rvert^{2},称为稀疏图,这种情况下可以使用邻接链表。对于每一个顶点,使用一个表存放所有邻接的顶点VexNode<ArcType, VexType> *VexTable;,每个结点有一条链表。所需的空间需求为\Theta(\lvert V \rvert)+\Theta(\lvert E \rvert)。对于有向图来说,对于边(v,w),结点w将出现在链表Vextable[v]中,所有邻接链表的长度之和等于\lvert E \rvert 。对于无向图来说,对于边(v,w),结点w将出现在链表Vextable[v]中,结点v将出现在链表Vextable[w]中,所有邻接链表的长度之和等于2\lvert E \rvert

邻接链表的C++实现:

guancha

SHow