1、第七章 图 7.1 图的定义与术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径,7.1 图的定义与术语1. 定义 图: Graph= ( V, R )其中: V= x| x dataobject x 是数据元素,在图中称为顶点。R= VR VR= | P( x, y )( x, y V ) VR 为顶点间关系的集合,为一条弧;x 为弧尾,y 为弧头;有向图。 为图中的一条边;x, y 称为终端点。无向图。,例:,邻接点:在无向图中 x, y 互为邻接点。 在有向图中,y 邻接自 x,x邻接到y.,顶点的度:无向图中,与v关联的边
2、数, 有向图中,顶点有出度与入度之分。,路径: 无向图 顶点序列;有向图中,顶点序列中的边必须是有向的。,边的权:表示从一个顶点到另一个顶点的距离或耗费。,子图: 图的一部分。,连通性:u ,v 之间有路径, u, v 之间是连通的;在图 G 中,任意的 vi,vj V,有 vi,vj 连通,图 G 是连通的,连通分量; 图中的极大连通子图。,生成树;图中包含全部顶点的极小连通子图。,结构的建立和销毁,插入或删除顶点,对邻接点的操作,对顶点的访问操作,遍历,插入和删除弧,基本操作,对邻接点的操作,FirstAdjVex(G, v); / 返回 v 的“第一个邻接点” 。若 /该顶点在 G 中没
3、有邻接点,则返回“空”。,NextAdjVex(G, v, w); / 返回 v 的(相对于 w 的) “下一个邻接 点”。若 w 是 v 的最后一个邻接点,则 返回“空”。,遍 历,DFSTraverse(G, v, Visit(); /从顶点v起深度优先遍历图G,并对每 /个顶点调用函数Visit一次且仅一次。,BFSTraverse(G, v, Visit(); /从顶点v起广度优先遍历图G,并对每 /个顶点调用函数Visit一次且仅一次。,7.2 图的存储结构,一、图的数组(邻接矩阵)存储表示,二、图的邻接表存储表示,三、有向图的十字链表存储表示,四、无向图的邻接多重表存储表示,7.2
4、.1 数组表示法,用两个数组分别表示顶点信息及边的信息。,0 1 0 1 0 1 0 1 0 1 A1= 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0,0 1 1 0 0 0 0 0 A2= 0 0 0 1 1 0 0 0,定义:矩阵的元素为,typedef struct ArcCell / 弧的定义VRType adj; / VRType是顶点关系类型。/ 对无权图,用1或0表示相邻否;/ 对带权图,则为权值类型。InfoType *info; / 该弧相关信息的指针 ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;,typedef
5、 struct / 图的定义VertexType / 顶点信息vexsMAX_VERTEX_NUM; AdjMatrix arcs; / 弧的信息 int vexnum, arcnum; / 顶点数,弧数 GraphKind kind; / 图的种类标志 MGraph;,#define INFINITY INT_max /最大值 #define MAX_VERTEX_NUM /最大顶点个数 typedef enum DG,DN,UDG,UDN GraphKind; /有向图,有向网,无向图,无向网,网的邻接矩阵定义为:, 1 0 30 100 5 50 A= 10 20 60 ,7.2.2 邻
6、接表 1)定义: 邻接表是图的一种链式存储结构。方法是对图中的每一个顶点建立一个依附于该顶点的边的表。而表头结点用一顺序结构(向量)的形式存储。,2)数据结构,typedef struct ArcNode int adjvex; / 该弧所指向的顶点的位置struct ArcNode *nextarc; / 指向下一条弧的指针InfoType *info; / 该弧相关信息的指针 ArcNode;,typedef struct VNode VertexType data; / 顶点信息ArcNode *firstarc; / 指向第一条依附该顶点的弧 VNode, AdjListMAX_VER
7、TEX_NUM;,3)无向图的邻接表,4) 有向图的邻接表,在邻接表及逆邻接表中,可得出图中结点的度,出度,入度,图中的边数等,typedef struct AdjList vertices;int vexnum, arcnum; int kind; / 图的种类标志 ALGraph;,图的结构定义(邻接表),7.2.3 十字链表 1) 定义 十字链表是有向图的一种存储结构。 是将有向图的邻接表与逆邻接表合并的结果。方法; 有向图中的每条边及每个顶点分别用一个结点表示。,2)数据结构,typedef struct ArcBox / 弧的结构表示int tailvex, headvex; Inf
8、oType *info;struct ArcBox *hlink, *tlink; ArcBox;,typedef struct VexNode / 顶点的结构表示VertexType data;ArcBox *firstin, *firstout; VexNode;,typedef struct VexNode xlistMAX_VERTEX_NUM; / 顶点结点(表头向量) int vexnum, arcnum;/有向图的当前顶点数和弧数 OLGraph;,7.2.4 邻接多重表,无向图的另一种链式存储结构,主要是针对邻接表中一条边存放两次的问题。邻接多重表中,每条边用一个结点表示,顶点
9、仍然用向量组的形式存放。,头结点,typedef struct Ebox VisitIf mark; / 访问标记int ivex, jvex; /该边依附的两个顶点的位置struct EBox *ilink, *jlink; InfoType *info; / 该边信息指针 EBox;,边的结构表示,顶点的结构表示,typedef struct VexBox VertexType data;EBox *firstedge; / 指向第一条依附该顶点的边 VexBox;,typedef struct / 邻接多重表VexBox adjmulistMAX_VERTEX_NUM;int vexnum, edgenum; AMLGraph;,无向图的结构表示,