数据结构之图(四)

六、图

图的概念

图是一种较线性表和树更为复杂的数据结构,在图形结构中,结点之间关系可以是任意的,图中任意两个数据元素之间都可能相关。

有向图和无向图     



若无向图中的每两个顶点之间都存在着一条边,则称该无向图称作完全无向图;显然完全无向图中包含着e=n(n-1)/2条边。若有无向图中的每两个顶点之间都存在方向相反的两条边,则称该有向图称作完全有向图;显然完全有向图中包含有e=n(n-1)条边。  
   
与图的边或弧相关的数叫做权,带权的图称为网。    



对于有向图而言,度又分为出度和入度。顶点的出度——以顶点v为弧尾的弧的数目;顶点的入度——以顶点v为弧头的弧的数目;顶点的度为该顶点的出度和入度的和。       



在无向图G中,如果从顶点v到顶点w存在路径,则称v到w是连通的。若图G中任意两个顶点之间都有路径相通,则称为连通图。

若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量。任何连通图的连通分量只有一个,即本身,而非连通图则有多个连通分量


在有向图中,若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图。

若有向图为非强连通图,其各个强连通子图称为它的强连通分量。


图的存储结构——邻接矩阵

邻接矩阵是表示顶点之间相邻关系的矩阵。   


无向图的邻接矩阵: 


有向图的邻接矩阵:


网的邻接矩阵:




图的存储结构——邻接表

邻接表存储方法是一种顺序分配与链式分配相结合的存储方法。它包括两部分:一部分是单链表,用来存放边的信息;另一部分是数组,主要用来存放顶点本身的数据信息。     


无向图邻接表:


有向图的邻接表:  



图的存储结构——十字链表

十字链表是有向图的另一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中,每条弧和每个顶点分别对应着一个结点。




图的存储结构——邻接多重表

邻接多重表是无向图的另一种链式存储结构。邻接多重表和十字链表一样,每条边和每个顶点分别对应着一个结点。     




图的遍历

从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程

根据搜索方法的不同,图的遍历有两种:深度优先搜索(DFS)和广度优先搜索(WFS)。

深度优先搜索

连通图深度优先搜索的算法: 



广度优先搜索


广度优先搜索是一种分层的搜索过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有回退的情况。因此,广度优先搜索不是一个递归的过程,其算法也不是递归的。


连通图的广度优先搜索算法:


非连通图广度优先搜索:   


无向图的连通分量和生成树

连通图生成树:一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有构成一棵树的n-1条边。



当无向图为非连通图时,从图中某一顶点除法,利用深度优先搜索算法或广度优先搜索算法不可能遍历到图中的所有顶点,只能访问到该顶点所在的极大连通子图的所有顶点,该极大连通子图称为无向图的一个连通分量。


使用不同的遍历图的方法,可以得到不同的生成树;从不同的顶点出发,也可能得到不同的生成树。


最小生成树

在连通网的众多生成树中,各边权值之和最小的生成树称为最小代价生成树,简称最小生成树。


生成最小生成树算法——普里姆算法:     



生成最小生成树算法——克鲁斯卡尔算法:   



有向无环图

一个无环的有向图称为有向无环图,简称DAG图。


拓扑排序

在一个有向图中,若用顶点表示活动,有向边表示活动间的先后关系,称该有向图叫做顶点表示活动的网络,简称AOV网。              

按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。由此所得顶点的线性序列成为拓扑有序序列。

拓扑排序:由某个集合上的一个偏序(集合中仅有部分成员之间可以比较)得到该集合上的一个全序(集合中全体成员之间均可以比较)的操作称为拓扑排序。

拓扑排序的算法:   



关键路径

在一个有向图中,若用顶点表示事件,弧表示活动,权表示活动持续时间,称该有向图叫做边表示活动的网络,简称为AOE网。











全部评论