图是一种比线性表和树更复杂的数据结构(非线性数据结构),在图中任意节点都可能有若干直接前驱和直接后继,属于网状结构类型。
有向图每条边都从一个顶点指向另一个顶点,形成了明确的方向性。在有向图中,顶点的度被分为出度和入度。出度是指以该顶点为起点的边的数量,而入度则是以该顶点为终点的边的数量。
无向图是一种由顶点和边组成的图,其中边没有方向性。
图可以是一个个孤点的集合,即边可能为0。此外N个顶点组成的图边最多为0.5*N*(N-1),当边数为0.5*N*(N-1)时,该图被称为无向完全图。对于有向图来说边最多为N*(N-1)。
图的边数也可以通过度来计算,图的边数等于图中所有顶点度数和的一半。
边(弧) 的条数相对顶点来说很少的图被称为稀疏图,反之为稠密图。
带权的图被称为网。
简单路径是指当经过途中顶点到顶点间的路径中没有重复顶点则为简单路径,若在路径中只有最后一个顶点与第一个顶点相同,则称为简单环或简单回路。
若点与点之间存在路径则称为点与点连通,若该中任意两点都连通,则该图称为连通图。连通分量(子图)指图中存在包含关系的连通图。
极大连通子图是指,当添加任意额外顶点将不构成连通图的连通子图。
可用两个数组储存图,一个数组储存顶点集(一维数组),另一个数组储存关系集(二维图),该二维图就是邻接矩阵。对于无向图而言邻接矩阵是对称的。C语言中一般以结构体的方式存储图,结构体中包含顶点集数组和关系集数组。
可用邻接表存储图,所谓邻接表就是把从同一个顶点发出的边连接在同一个称为边链表的单链表中。边链表的每个结点代表一条边,称为边结点,每个边结点有两个域:该边终点的序号以及指向下一个边结点的指针。存储顶点信息的数组。在顶点数组中,每个元素有两个成员:一个成员用来存储顶点信息;另一个成员为该顶点的边链表的表头指针。
邻接表能够高效地存储稀疏图(即边数相对较少的图),因为它只为实际存在的边分配存储空间。此外,对于需要频繁查找一个顶点的所有相邻顶点的应用,邻接表提供了快速的访问方式。
对于密集图(即边数接近顶点数平方的图),邻接表可能不是最佳选择,因为此时边链表可能会变得很长,导致空间效率下降。在这种情况下,邻接矩阵可能是一个更好的选择。