图
相关概念
元素之间存在多对多关系(线性表的元素之间存在前驱和后继,树的元素之间存在父子关系,图的任意元素之间都有可能存在关系)
由顶点的有穷非空集合和顶点之间边的集合组成。
在图型数据结构中,数据被称为顶点,数据之间的关系统称为边。
在图中不允许出现没有点,但可以没有边。
G(V,E),V表示顶点的集合,E表示边的集合
各种图的定义
无向图:顶点与顶点之间没有方向,这种边称为无向边,边用无向偶对表示(v,v1)。
V={A,B,C,D} E={(A,B),(B,C),(C,D),(D,A),(A,C)}
在无向图中,如果任意两个顶点之间都存在边,这种图称为无向完全图。
无向完全图的边的数量:n*(n-1)/2(n指无向图的顶点数)。
有向图:若顶点之间有方向,这种边称为有向边,也叫弧,用有序偶对表示<v,v1>,V1叫做弧头,V叫做弧尾。
注意:若不存在顶点到自身的边,也不存在重复出现的边,这种图叫做简单图,数据结构课程中讨论的都是简单图。
在有向图中,如果任意两个顶点之间存在方向相反的两条弧,这种图叫做有向完全图
图中有很少边或弧的图叫稀疏图,反之叫稠密图。
如果图中的边或狐有相关的数据,数据称为权,这种图称为网(带权图)。
如果G(V,E)和G1(V1,E1),存在V包含V1,且E包含E1,那么G1称为G的子图。
顶点与边的关系:
顶点的度:指的是顶点相关联的边或弧的条目数。
有向图又分为入度和出度。
入度:其他顶点到该顶点的弧的条目数。
出度:从该顶点出发到其它顶点的弧的条目数。
顶点序列:从一个顶点到另一个顶点的路径,路径长度指的是路径上的边或弧的条目数。
连通图:在无向图中,在顶点V到V1之间有路径,则称V到V1之间是连通的。如果任意两个顶点都是连通的,那么称这个无向图为连通图。
连通分量:无向图中的极大连通子图称为连通分量:
1、必须是子图
2、子图必须是连通的
3、连通子图具有极大的顶点数。
在有向图中,在任意顶点之间都存在路径,则称这种图叫做强连通图。
在有向图中的极大连通子图称为有向的强连通分量。
在有向图中如果有一个顶点的入度为0,其它顶点的入度均为1,则是一棵有向树。
图的存储结构:
图的存储主要是两个方面:顶点、边
邻接矩阵:
一个一维数组(顶点)和一个二维数组(边、弧)组成。
二维数组i,i位置都是0,如果是无向图,则根据中轴线对称(左上到右下的对角线为轴)。
优点:
1、非常容易判定两点之间是否有边。
2、非常容易计算某个点的入度和出度。
3、非常容易统计邻接点。
4、如果是稀疏图,非常浪费存储空间。
邻接表:由顶点表,边表组成。
顶点表:
顶点 邻接点地址/下标
边表:
项目下标|下一个邻接点地址。
优点:
1、节省存储空间。
2、非常容易计算出度
缺点:
1、不方便计算入度
十字链表:由于邻接表不能同时兼顾出度和入度,因此我们修改邻接表的边表结构,使它既存储入度,也存储出度,这种表就叫十字链表。
邻接多重表:由于遍历表时需要一些删边操作,而邻接表在删除边时非常麻烦,因此就设计出了邻接多重表。
边集数组:由两个一维数组构成,一个存储顶点的信息,另一个存储边的信息(它的每个数据元素都由一条边的起点到终点的下标和权组成),这种存储结构更侧重于边的相关操作(路径、路径长度、最短路径),而统计顶点的需要扫描整个数组,效率不高。
图的遍历:
注意:图的遍历结果无论是深度优先还是广度优先都不是唯一的。
深度优先:类似树的前序遍历
广度优先:类似树的层序遍历,与树一样也需要是使用队列配合。