22. 基本的图算法
本章介绍图的表示和搜索。
许多的图算法在一开始都会先通过搜索来获得图的结构,其他一些图算法则是对基本的搜索加以优化。
可以说,图的搜索技巧是整个图算法领域的核心。
图的表示
G=(V,E) G = ( V , E )
图G由结点的集合V 和 边的集合E 组成
可以用两种方法表示,一种是邻接链表(下图b),一种是邻接矩阵(下图c)。
邻接链表一般用于表示稀疏图(边数 |E| | E | 远小于 |V|2 | V | 2 ),默认都使用邻接链表表示。在稠密图( |E| | E | 接近 |V|2 | V | 2 )的情况下,倾向使用邻接矩阵。
无向图:
有向图:
邻接链表表示
由一个链表数组 Adj A d j 组成,数组大小为 |V| | V | ,链表 Adj[u] A d j [ u ] 存储了结点 u u 出发的边的终点。
比如上面无向图中,从结点1出发有两条边,边的终点分别是2和4,反应到邻接链表中就是
存储了两个节点2和4。
邻接链表需要的存储空间为 Θ(|V|+|E|) Θ ( | V | + | E | )
邻接矩阵表示
由一个 |V|×|V| | V | × | V | 的矩阵 A=(aij) A = ( a i j ) 表示,并满足以下条件:
当边有权重时, aij a i j 可以存储权重值。
邻接矩阵需要的存储空间为 Θ(|V|2) Θ ( | V | 2 )
一些术语
一个结点的出度为,从这个结点触发的边的个数。
一个结点的入度为,到达这个结点的边的个数。
广度优先搜索
思路:利用一个队列,首先将头结点插入