前言
本篇进入图的学习,继前篇树之后,将学习比树更加复杂的结构。有向图无向图或者是否闭合,都有广泛的应用。关于图在一些实际应用中的例子,本篇会给几个例子。(插图较多)
看完本篇,你将了解到:
(1)什么是图?什么是网?图的常用术语有哪些?
(2)图的相关操作(类比于树和线性表)
(3)图的表示方法(同样也有数组和链表两种),本篇将新介绍一个邻接表
(4)将重点讨论有向图和无向图的表示方法
(5)重点!!!图的遍历(常听到的深度优先搜索DFS及广度优先搜索BFS)
一、图的定义和术语
在线性表中,数据元素为一对一的关系,在图中,任意两个数据元素都可能相关
1.图的定义
(1)图G由顶点集V和关系集VR组成的二元组,记为:G=(V,VR)
(2)V(具有相同特征的数据元素的集合):图中的数据元素我们通常称为顶点,因此V也称为顶点(元素)的有穷非空集
(3)VR:两个顶点之间关系的集合
2.有向图、弧(有向边)
(1)若图G任意两顶点a,b之间的关系为有序对<a,b>,即<a,b>∈VR,则称<a,b>为从a到b的一条弧/有向边
(2)其中:a是<a,b>的弧尾(初始点)
b是<a,b>的弧尾(终止点)
(3)有向图:由顶点集合弧的集合组成的图
例:G1=(V,VR)
V={A,B,C,D,E}
VR={<A,C>,<A,D>,<C,D>,<B,E>,<E,B>}
3.无向图、边(无向边)
如果顶点间的关系是无序对,ab之间用()表示,称无序对表示顶点a与b的一条边
(1)无向图:由顶点集合与边的集合组成的图
(2)图中若a、b间有边,则称(a,b)表示a、b互为邻接点,(a,b)依附于a和b,(a,b)与a和b相关联
例:G2={V,VR}
V={V1,V2,V3,V4,V5,V6}
VR={(V1,V3),(V1,V5),(V3,V5),(V4,V6)}
4.完全图
(1)n:顶点的数目
(2)e:边或者弧的数目。
取值范围:0–n(n-1)/2 (若任意两个顶点间都有边,则e取最大值)
(3)有n个顶点和n(n-1)/2条边的无向图称为完全图
5.有向完全图
有n个顶点和n(n-1)条弧的有向图
6.网(Network)
边(弧)上加权的图,分为有向网和无向网
故有4种类型的图:有向图、无向图、有向网、无向网
7.图的常用术语
(1)子图:对图G=(V,VR)和G1=(V1,VR1),若V1是V的子集且VR1是VR的子集,则称G1是G的一个子图
G1,G2,G3均为G的子图,但G4不是
(2)度:无向图中与顶点v相关联的边(x,y)的数目,称为v的度
记作TD(v)或D(v)
无向图某顶点的度表示:该顶点有多少个邻接顶点
①出度OD(v):以顶点v为弧尾的弧的数目
②入度ID(v):以顶点v为弧头的弧的数目
例:OD(A)=1
OD(B)=2
OD(C)=0
ID(A)=1
ID(B)=1
ID(C)=1
顶点的度:
TD(A)=OD(A)+ID(A)=2
TD(B)=OD(B)+ID(B)=3
TD(C)=OD(C)+ID(C)=1
(3)连通性的术语
顶点vi到vj有路径:存在一个顶点序列vi,vi1,vi2,…,vim,vj
其中(vi,vi1),(vi1,vi2),…,(vim,vj)是图的边或弧
(4)连通图及其分量(无向图G)
①若从顶点vi到vj有路径,则称二者是连通的
②连通图:图G中任意两顶点是连通的
③连通分量:无向图的极大连通子图
注:连通图的连通分量是自己,非连通图会有几个连通分量
(5)强连通图及强连通分量(有向图G)
①强连通图:图G中每对顶点vi,vj之间,从vi到vj,陈vj到vi都存在路径
②强连通分量:有向图的极大强连通子图
注:强连通图的强连通分量是自己
(6)生成树
连通图的极小连通子图 ,包含图中所有顶点和n-1条边
8.图的操作
(1)CreateCraph(&G,V,VR):根据顶点集V和关系集VR生成图
(2)DestroyCraph(&G):销毁图
(3)Locate(G,v):查找顶点u的位置
(4)GetVex(G,v):读取顶点v的信息
(5)PutVex(&G,v,value):给顶点v赋值
(6)FirstAdjVex(G,v):读v的第一个邻接点
(7)NextAdjVex(G,v,w):读v(相当于w)的下一个邻接顶点
(8)InsertVex(&G,v):插入顶点
(9)DeleteVex(&G,v):删除顶点
(10)InsertArc(&G,v,w):插入弧<v,w>
(11)DeleteArc(&G,v,w):删除弧<v,w>
(12)DFSTraverse(G,visit()):深度优先遍历图
(13)BFSTraverse(G,visit()):宽度优先遍历图
…
二、图的存储结构
1.数组表示法(易于判断两个顶点是否有关系)
(1)数组表示法:用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系
(2)顶点数组:用一维数组存储顶点(元素 )
(3)邻接矩阵:用二维数组存储顶点(元素)之间的关系(边或弧)
1)例1:无向图
①将4个顶点依次存放到顶点数组,保存所有顶点的信息
顶点数组vexs v1 v2 v3 v4
0 1 2 3
②用邻接矩阵(arcs)表示二者之间的关系:1表示顶点之间有关系,0表示顶点之间无关系
位置序号分别为i、j,若顶点vi和vj之间有边,则矩阵中aij和aji均赋值为1,否则为0