0.图的定义
图是由顶点集合和顶点关系集合组成的一种数据结构:,其中,顶点集合V是有穷非空集合,其包含数据元素;E是边的有穷集合,Path(x,y)表示从顶点x到顶点y的一条单向通路,通路有方向,图包括有向图和无向图。(1)若存在一对顶点,表示顶点u与v的一条边,此时图为无向图。(2)若,表示从u到v的一条弧,且u为弧尾,v为弧头,此时的图称为有向图。若有边或弧,则称为完全图。
有时在图的边或弧上附上数字表示相关的量,这种与图的边或弧相关的数字叫做权,权表示顶点之间的距离,带权的图叫网。如果一个图的顶点和定点关系被另外一个图包含,则该图是大图的子图。无向图中的与该顶点相关的边叫度,有向图中以该顶点为弧头的叫入度,维尾叫出度。边或弧=TD(第i个顶点)。从一个顶点到另一个顶点的边或弧叫路径,其边或弧数叫路径数目,顶点和终点相同的叫做环或回路,除了终点(起点)外都不重复出现叫简单回路或简单环。如果从一个点到另一个点有路径,则称两个点是连通的。任意两个点都是连通的则称该图为连通图,连通分量指无向图中的极大连通子图。
1.存储方式
(1)邻接矩阵表示
无向图的邻接矩阵一定是一个实对称矩阵。对于网,则有
(2)邻接表表示
邻接表是顺序存储和链式存储的结合。
图中的每个顶点与它的邻接点链接成一个单向链表:顶点为头结点,链表中每个结点代表一条边(边结点),链表中结点值(即数据域中值)是与头结点相邻结点在表中序号,头结点的指针指向第一个邻接点(表结点)。
(3)十字链表表示
十字链表是有向图的另一种存储结构,目的是将在有向图的邻接表和逆邻接表中两次出现的同一条弧用一个结点表示,由于在邻接表和逆邻接表中的顶点数据是相同的,则在十字链表中只需要出现一次,但需保留分别指向第一条“出弧”和第一条“入弧”的指针。(1)头结点(VexNode)中包括数据域(存放顶点信息)出弧指针域(指向第一条以某顶点为弧尾的弧)以及入弧指针域(指向第一条弧头指向某顶点的弧)。
(2)弧结点(ArcBox)中包括四个域:两个数据域分别表示弧所依赖的两个顶点序号,两个指针域分表链接下一条与某顶点相关的出弧和下一条与该顶点相关的入弧。
(3)头结点序列便组成了十字链表(OLGraph类)的数据。
类似于有向图的十字链表,若将无向图中表示同一条边的两个结点合在一起,将几个边链表合并,得到无向图的另一种表示方法——邻接多重表。
2.图的遍历
深度优先搜索类似于树的先根遍历,是树的先根遍历的推广。深度优先搜索是个不断探查和回溯的过程。
图的广度优先搜索类似于树的层次遍历。