文章目录
图
定义
图是由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构
形式化定义
Graph=(V,E)
V={x|x∈某个数据对象}是顶点的有穷非空集合
· 对于n个顶点的图,对每个顶点连续编号,即顶点的编号为0~n-1
E= {(x, y)|x,y∈V}或E={<x, y>|x,y ∈V && Path (x, y)}是顶点之间关系的有穷集合,也叫做**边(**edge)集合。
· *Path (x,y)*表示从x到y的一条单向通路,它是有方向的。
(从0到1是一条边,从1到0又是一条边;所以有八条边)
ADT
ADT Graph {
数据对象:
D= {ai| ai∈ ElemType, i=1,2…,n, n≥0} //ElemType为类型标识符数据关系;
R={<ai,aj> | ai,aj∈D, i=1,2,…,n, j=1,2…n,其中每个元素可以有零个或多个前驱节点,可以有零个或多个后继节点}
数据操作:
(1)初始化图InitGraph(&g):构造一个空的图g
(2)销毁图ClearGraph(&g):释放图g占用的内存空间
(3)DFS(G,v):从顶点v出发,深度优先遍历图g
(4)BFS(G,v):从顶点v出发,广度优先遍历图g
}
有向图和无向图
有向图
· 边之间的顶点对是有序的,则称G为有向图。
· <i,j>∈ E(G)表示由i到j方向有一条边。
无向图
· 边之间的“顶点对”是无序的,则称图G为无向图。
· (i,j)表示一条无向边和(j,i)是同一条边。
· 无向图的形式化定义:若对任意<v,w> ∈ E(G),有<w,V> ∈ E(G),则G是无向图。
完全有向图和完全无向图
完全无向图
无向图中的每两个顶点之间都存在着一条边,则此图为完全无向图。
若有n个顶点的完全无向图有n(n-1)/2条边
完全有向图
有向图中的每两个顶点之间都存在着方向相反的两条边,则此图为完全有向图。
有n个顶点的完全有向图有**n(n-1)**条边,
术语
邻接顶点
如果(u,v)是E(G)中的一条边,则称u与v互为邻接顶点。
子图
设有两个图G=(V, E)和G’=(V, E’)。若V’⊆V且E’⊆E,则称图G’是图G的子图。
权
图中每一条边都可以附有一个对应的数值,这种与边相关的数值称为权。
权可以表示从一个顶点到另一个顶点的距离或花费的代价。
网
边上带有权的图称为带权图,也称作网。
度
顶点的度
在无向图中
在有向图中
路径
在一个图G=(V, E)中,从顶点i到顶点j的一条路径是一个顶点序列(i,i1,i2,…im,j)
若此图G是无向图,则边(i,i1),(i1,i2), … (im-1 ,im), (im,j)属于E(G);
若此图是有向图,则<i,i1>,<i1,i2>, … <im-1 ,im>, <im,j>属于E(G)。
路径长度
非带权图的路径长度是指此路径上边的条数。
带权图的路径长度是指路径上各边的权之和。
连通图与连通分量
在无向图G中,若从顶点i到顶点j有路径,则称顶点i和j是连通的。
若无向图G中任意两个顶点都连通,则称G为连通图,否则称为非连通图。
无向图G中的极大连通子图称为G的连通分量。
强连通图与强连通分量
在有向图G中,若从顶点i到顶点j有路径,则称从顶点到j是连通的。
若有向图G中的任意两个顶点i和j都连通,则称图G是强连通图。
有向图G中的极大强连通子图称为G的强连通分量。
存储结构一 邻接矩阵
建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。
设图A=(V, E)有n个顶点,则图的邻接矩阵是一个二维数组,定义为:
ps:(1)无向图的邻接矩阵是对称的;
(2)顶点i的度=第i行(列)中1的个数;
完全图的邻接矩阵中,对角元素为0,其余1
ps:(1)有向图的邻接矩阵可能是不对称的;
(2)顶点的出度=第i行元素之和,顶点的入度=第i列元素之和;顶点的度=第i行元素之和+第i列元素之和。
完全图的邻接矩阵中,对角元素为0,其余1。
构造算法
调用函数
int LocateVex(MGraph G,VetexType u)
{//存在则返回u在顶点表中的下标;否则返回-1
int i;
for(i=0;i<G.vexnum;++i)
if(u==G.vexs[i])
return i;
renturn-1;
}
特点
图的邻接矩阵表示是唯一的。
邻接矩阵的存储
无向图的邻接矩阵一定是一个对称矩阵,可以考虑压缩存储。
不少邻接矩阵是一个稀疏矩阵, 当图的顶点较多时,可以采用三元组表的方法存储。
顶点的度
对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度。
对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度(或入度)。
优点
容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。
缺点
n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。
适用范围
对稀疏图而言浪费空间,适合稠密图。
存储结构二 邻接表
顺序分配与链式分配相结合;
对每个顶点vi建立一个单链表,把与vi有关联的边的信息(即入度或出度边)链接起来,表中每个结点都设有2个域;
ps:(1)无向图的邻接表是不唯一的;
(2)顶点i的度=第i个链表中结点的个数;
(3)空间效率为O(n+2e),若稀疏图(e<<n2),比邻接矩阵O(n2)省空间。
ps:(1)除了n个头结点外,只有e个表结点,空间效率为O(n+e)。若是稀疏图,则比邻接矩阵合适。
(2)出度OD(Vi)=邻接表中链接的结点数;
(3)入度ID(Vi)= =逆邻接表中链接的结点数。
ps:当邻接表的存储结构形成后,图便唯-一确定
构造算法
特点
对邻接矩阵的一种改进
邻接表表示不唯一:
无向图
对于有n个顶点和e条边的无向图,其邻接表有n个顶点节点和2e个边节点,空间效率为O(n+2e)
若是稀疏图(e<<n2),则比邻接矩阵表示0(n2)省空间。
有向图
邻接表中除了n个头结点外,只有e个表结点,空间效率为O(n+e)。
若是稀疏图,则比邻接矩阵合适。
有向图顶点的出度
有向图顶点的入度
优点
容易寻找顶点的邻接点;
缺点
判断两顶点间是否有边或弧,需搜索两顶点对应的单链表,没有邻接矩阵方便;
适用范围
适合稀疏图;