图
基本定义
图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
注意:在图中数据元素称之为顶点,且顶点集合V是有穷非空的,即不存在空图这个定义
图按照有无方向可分为无向图和有向图
无向边:顶点vi与vj之间的边没有方向,用(vi.,vj)表示,也可用(vj,vi)表示
有向边:顶点vi到vj之间有方向,该有向边又称弧,用<vi,vj>表示,vi为弧尾,vj为弧头,方向从vi到vj,次序不可调换,用<>表示
简单图:不存在顶点到自身的边,且同一条边不重复出现
无向完全图:在无向图的基础上,若任意两个顶点之间都存在边,即n个顶点含有n*(n-1)/2条边
有向完全图:如果任意两个顶点之间都存在方向互为相反的两条弧
图按照边和弧的多少,可以分为稀疏图和稠密图
权:与图的边或弧相关的数
网:带权的图
顶点与边
无向图
对于无向图G(V,{E}),如果边(vi,vj)属于E,则顶点vi和vj互为邻接点,即vi与vj相邻接,或者说(vi,vj)与顶点vi,vj相关联。
与顶点v相关联的边的数目,记为TD(v),称为v的度
可发现顶点的度之和等于边数的2倍
有向图
对于有向图G(V,{E}),如果有弧<vi,vj>属于E,则称顶点vi邻接到顶点vj(或顶点vj邻接自顶点vi)。弧<vi,vj>与顶点vi,vj相关联
以顶点v为头的弧的数目称为v的入度,记为ID(v)
以顶点v为尾的弧的数目称为v的出度,记为OD(v)
顶点v的度称为TD(v) = ID(v) + OD(v)
无向图中从顶点vi到vj的路径是一个顶点序列(v=vi,0 , vi,1 , vi,2 ,..., vj)其中(vi,j-1 , vi,j)属于E,1<=j<=m
路径长度:路径上边或者弧的数目
回路或环:第一个顶点到最后一个顶点相同的路径
简单路径:序列中顶点不重复出现的路径
简单回路或简单环:除了第一个和最后一个顶点之外,其余顶点不重复出现的回路
连通图
在无向图G中,若从顶点vi到顶点vj有路径,则称vi与vj是连通的。若对于图中任意两个顶点均是连通的,则称G是连通图
连通分量:无向图中极大连通子图
条件:子图、子图连通、连通的子图含有极大顶点数、具有极大顶点数的连通子图包含依附于这些顶点的所有边
在有向图G中,如果对于每一对vi,vj,从vi到vj和从vj到vi都有路径,则称G是强连通图
强连通分量:有向图中的极大强连通子图
连通图的生成树:是一个极小的连通子图,含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边
一个图如果只有n个顶点和n-1条边,则为非连通图
如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树
一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧
图的抽象数据类型
ADT 图(Graph)
Data
顶点的有穷非空集合和边的集合
Operation
CreateGrapth(*G,V,VR); //按照顶点集V和边弧集VR的定义构造图G
DestroyGraph(*G); //G存在删除G
LocateVex(G,u); //若图G中存在顶点u,返回其在图中位置
GetVex(G,v); //返回图G中顶点v的值
PutVex(G,v,value); //将图G中的顶点v赋值给value
FirstAdjVex(G,*v); //返回顶点v的一个邻接顶点,若顶点在G中无邻接顶点,则返回空
NextAdjVex(G,v,*w); //返回顶点v相对于顶点w的下一个邻接顶点,若w是v的最后一个邻接顶点则返回空
InsertVex(*G,v); //在图G中新增顶点v
DeleteVex(*G,v); //删除图G中顶点v及其相关的弧
InsertArc(*G,v,w); //在图G中新增弧<v,w>若G是无向图,还需增加对称的弧<w,v>
DeleteArc(*G,v,w); //在图G中删除弧<v,w>若G是无向图,还需删除对称的弧<w,v>
DFSTraverse(G); //对图G进行深度优先遍历,在遍历的过程中对每个顶点进行调用
HFSTraverse(G); //对图G进行广度优先遍历,在遍历的过程中对每个顶点进行调用
endADT