图的定义:
图 (Graph) 是一种复杂的非线性数据结构,由顶点V(Vertex)集合及顶点间的关系(也称弧或边)E(Edges)集合组成,可以表示为: G=(V, E)。
图的基本术语:
完全图:有n(n-1)/2条边的无向图
完全有向图:有n(n-1)条边的有向图
入度:有向图中以顶点v为终点的弧目称为v的入度
出度:有向图中以顶点v为起始的弧目称为v的出度
根据图是否有向,可以将图分为有向图和无向图。
图可以用两种标准方式来表示:
- 邻接链表
- 邻接矩阵
邻接链表
邻接链表由 |V|条链表构成,即每个顶点 Vi∈V有一条链表,链表中存储该顶点的相邻顶点。
图C为无向图 G=(V,E) |V|=5 |E|=7 的邻接链表表示,共有5条链表,且所有邻接链表的长度之和等于2|E|, 即14。
图D为有向图 G=(V,E) |V|=5 |E|=7 的邻接链表表示,邻接链表的长度之和等于|E|。
不论是有向图还是无向图均需要的存储空间为 Θ(V+E)。
邻接矩阵
对于邻接链表而言,存在一个明显的不足就是无法快速判断边(u,v)是否为图中的边,而邻接矩阵恰恰克服了这一缺陷。
邻接矩阵,对于图G而言,其邻接矩阵由 |V|×|V|的矩阵 A=(aij)表示, 并满足以下关系:
- aij=1 (i,j)∈E 即两个顶点间有边则为1
- aij=0 其他
图E、图F分别给出了无向图与有向图的邻接矩阵表示,其空间需求皆为Θ(V2)。
图搜索算法的基本流程
- 创建一个容器,一般称为openlist,用来存储将要访问的节点
- 将起点加入容器
- 开始循环:
- 弹出:从容器中取出一个节点
- 扩展:获取该节点周围的节点,将这些节点放入容器