图基本概念:
G(V,E) Graph = (Vertex,Edge)
V:顶点(数据元素)的有穷非空集合;
E:边的有穷集合。
有向图,无向图
完全图:任意两个点都有一条边相连;
稀疏图(e < blgn),稠密图
网:边或弧带权的图;
邻接:有边或弧相连的两个顶点之间的关系。存在(Vi,Vj),则称Vi,Vj互为邻接点。
存在<Vi,Vj>,则称Vi邻接到Vj,Vj邻接于Vi。
关联(依附):边或弧与顶点之间的关系存在(Vi,Vj)或<Vi,Vj>则称该边或弧依附于或关联于Vi,Vj两个顶点。
顶点的度:与该顶点相关联的边的数目,记为TD(v);
在有向图中,出度OD(v),入度ID(v),度 = 入度+出度。
路径:接续的边构成的顶点序列;
路径的长度:路径上边或弧的数目或权值之和;
回路(环):第一个顶点与最后一个顶点相同的路径;
简单路径:除路径起点和终点可以相同外,其余顶点均不同的路径;
简单回路(简单环):除路径起点和终点相同外……同上。
图中边或弧所具有的相关数称为权,表明从一个顶点到另一个顶点的距离活着耗费。
连通图(强连通图):
在无(有)向图中G = (V , {E}),若对任和两个顶点v,u都存在从v到u的路径,则称G是连通图(强连通图)。
子图:设有两个图G = (V , {E})和G1 = (V1 , {E1})若v1属于v,E1属于E则称G1是G的子图。
连通分量(强连通分量):无(有)向图的极大连通子图称为G的(强)连通分量;
极大(强)连通子图意思是:该子图是G的(强)连通子图,该G的任何不在该子图中的顶点加入。子图不在(强)连通;
极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边,子图不在连通;
生成树:包含无向图G的所顶点的极小连通子图;
生成森林:对于非连通图,有各个连通分量的生成树的集合。
图的存储:
图的逻辑结构:多对多;
图没有顺序存储结构,但是可以借助二维数组来表示元素间的关系;
数组表示法:邻接矩阵;
链式存储结构:多重链表、邻接表、邻接多重表、十字链表;
1.数组(邻接矩阵)表示法:
建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点间关系)
设图 A = (V , E)有n个顶点
则顶点表Vexs[n] :
i | 0 | 1 | 2 | …… | n-1 |
Vexs[n] | V1 | V2 | V3 | …… | Vn |
图的邻接矩阵是一个二维数组:A.arcs[n][n],定义为:
A.arcs[i][j] = {1,如果<i,j>属于E,或(i,j)属于E
{0,否则 (没找到“大”括号,用两个小的大括号表示)
无向图的邻接矩阵是对称的,顶点 i 的度 == 第 i 行(列)中1 的个数;
有向图:第 i 行为以 Vi 为结尾的弧(即出度边),第 i 列入度边;
顶点的度 = 第 i 元素之和 + 第 i 列元素之和。
2.网(即有权图)的邻接矩阵表示法:
定义 A.arcs[i][j] = { Wij <Vi, Vj> 或 (Vi, Vj) 属于E
{ ∞ 无边(弧)
3.邻接表表示法(链式):
顶点:按编号顺序将顶点数据存储在一维数组中;
关联同一顶点的边(以顶点为尾的弧):用线性链表存储
头结点:data | firstarc
表结点: adjvex | nextarc nextarc用来指示下一条边或弧;
无向图链接表不唯一
若无向图中有n个顶点,e条边,则其邻接表需要n个头结点和2e个表节点,因此适宜存储稀疏表;
无向图中顶点Vi的度为第 i 个单链表中的结点数;
在有向图中:找出度容易,找入度难;
当邻接表的存储结构形成后,便唯一确定图;
邻接表中每个链表对应于邻接矩阵中的一行,链表中结点的个数等于一行中非零元素的个数;
对于任一确定的无向图,邻接矩阵是唯一的(行列号于顶点编号一致),但邻接表不唯一(链接次序于顶点编号无关)
邻接矩阵的空间复杂度为O(n^2),而邻接表的空间复杂度为O(n+e);
邻接矩阵多用于稠密图,而邻接表多用于稀疏图。
3.十字链表(orthogonal list):
是有向图的另外一种存储结构,也可以看成是将有向图的邻接表的和逆邻接表结合起来形成的一种链表;
有向图中的每一条弧对应十字链表中的一个弧结点,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点。
顶点结点:data | firstin | firstarc
弧结点: tailvex | headvex | hlink | tlink
4.邻接多重表:
顶点结点: data | firstdge —>指向第一条依附于该顶点的边;
边结点: mark | ivex | ilink | jvex | jlink | info —>存放信息;
mark:标志域标记,此边是否被搜索过;
ivex,jvex:该边依附的两个顶点在表头数组中的位置;
ilink,jlink:指向依附于ilink,jlink的下一条边。