连通图:任意两点都连通。
强连通图:任何一对顶点可以互通。
图背下来考点:
对于无向图:
- 如果是连通图,至少有n-1条边,如果边数超过n-1必有回路,如果是非连通图最多有C(n-1,2)条边
- 所有点度数之和为2E
- 完全图有C(n,2)边
有向图:
- 对于有向图,如果是强连通,至少需要n条边,构成回路
- 所有顶点入度之和=所有顶点出度之和=边数
- 完全图有2C(n,2)边
存储结构
邻接矩阵
m(i)(j) = 1表示点i与点j存在一条边,无向图即存在一条边,有向图存在i到j的边。0就不存在。
求入度,遍历行,求出度遍历列,复杂度都O(|v|)。
求领接点,遍历行,遍历列,复杂度同上。
优点:简单,有向无向都能用。缺点:存稠密图还行,存稀疏图空间浪费太大。
邻接表
类似树的孩子表示法。结点用顺序存储,一个顺序存储块有一个链表,里面存放与这个点连接的边。
求出度,遍历链表就好,遍历入度,需要遍历整个存储结构。
对于无向图友好,对于有向图不友好(在进行求入度时候)。
在进行删除也不友好,也需要遍历整个存储结构。
十字链表法
只用于有向图
与优化矩阵是有的十字链表相同。
用于存储有向图,每一个点包含自身数据集与两个指向边结点指针,一个指向自己结点指向其余结点的边,一个指向别的直接指向自己的边,也就是矩阵的行与列。
每一个边结点数据块内存放由哪一个结点指向哪一个结点,以及边数据。包含两个边结点指针,一个行指针,一个列指针。
优化了邻接矩阵空间浪费的问题,同时求入度与出度都只需要遍历行链表或列链表就可以了。
邻接多重链表
只用于无向图
每一个顶点结点包含数据块与一个边结点指针,指向一个与自己有关的边。
每一个边结点包含数据区域:哪一个顶点指向哪一个顶点,边数据,两个边结点指针,两个指针指向与不同顶点相关的边。
单纯从存储结构来看,十字链表的边结点与这个完全一致。但二者指针指向东西不同。邻接多重链表需要指向下一个边与顶点相关,与边从哪个顶点指到那个顶点无关。但是十字链表与位置有关。
邻接多重优化了邻接表重复存储问题与删除操作的问题。