图的基本概念
多对多关系
图(graph)是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成;
其形式化的定义如下:
Graph = (V,E)
V = {x|x∈某个数据对象}
E = {<u,v>|P(u,v)^(u,v∈V)}
V是具有相同特性的数据元素的集合,V中的数据元素通常称为顶点(Vertex),
E是两个顶点之间关系的集合,P(u,v)标识u和v之间由特定的关联属性。
若<u,v>∈E,则<u, v>表示从顶点u到顶点v的一条弧,并称u为弧尾或七十点,称v为弧头或终止点,他表示顶点u和顶点v之间的一条边,此时图中顶点之间的连线是没有方向的,这种图称为无向图(undirected graph)。
在无向图和有向图中V的元素都称为顶点,而顶点之间的额关系却有着不同的称谓,即弧或边,为避免麻烦,在不影响理解的前提下,我们统一将他们称为边(edge)。并且我们还雪顶顶点集与边集都是有限的,并记顶点与边的数量为|V|和|E|
无向图实际上也是有向图,是双向图。
加权图
在实际应用中,图不但需要表示元素之间是否存在某种关系,而且图的边往往与具有一定实际意义的数有关,即每条边都有与它相关的实数,称为权。
这些权值可以表示从一个顶点到另一个顶点的距离或或消耗等信息,在本章中假设边的权均为正数。
图的存储
邻接矩阵:二维数组,顺序结构
邻接表:链表,链式存储结构
图的遍历
图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问依次。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。
深度优先遍历(DFS depth-first search):类似于树的先根遍历,是树的先根遍历的推广(可以采用递归和借助栈的非递归方式实现)
广度优先遍历(BFS breadth-first search):遍历类似于树的层次遍历,它是树的按层遍历的推广(借助队列 非递归的方式实现)
无相图的深度优先遍历:0->1->3->7->4->2->5->6
无相图的广度优先遍历:0->1->2->3->4->5->6->7