数据结构第7章图(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章 图
7.1 图的类型定义
7.2 图的存储结构 7.3 图的遍历
7.4 最小生成树
7.5 有向无环图及其应用
7.6 最短路径
可编辑版
1
7.1 图的类型定义
图 是由一个顶点集 V 和一个关系集 R构成的数据结构。
Graph = ( V , R )
其中: V = { ei | ei∈ElemSet, i = 1, 2, … , n }
R = { VR } VR = { <v, w> | v, w∈V 且 P(v, w) } 谓词 P(v, w) 定义了 <v, w>之间关系的意义或信息。
可编辑版
2
7.2 图的存储表示
一、图的数组(邻接矩阵)存储表示
二、图的邻接表存储表示
三、有向图的十字链表存储表示
四、无向图的邻接多重表存储表示
//{有向图,有向网,无向图,无向网}
typedef struct ArcCell { //存储弧/边的信息,即邻接矩阵 VRType adj; // VRType是顶点关系类型。 //对无权图,用1或0表示相邻否; // 对带权图,则为权值类型。 InfoType *info; // 该弧相关信息的指针 } ArcCell, AdjMatrix[MAX_VERTEX可编_N辑版UM][MAX_VERTEX_NUM9];
data firstarc 数组元素结点
adjvex nextarc info
链表结点
可编辑版
14
图的邻接表存储表示
#define MAX_VERTEX_NUM 20 typedef struct ArcNode { //边链表结点
int adjvex; // 该弧所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 InfoType *info; // 该弧相关信息的指针 } ArcNode;
➢图的数组存储表示
typedef struct { //存储数据元素信息 VertexType vexs[MAX_VERTEX_NUM]; // 存储数据元素信息,即顶点向量 AdjMatrix arcs; // 邻接矩阵 int vexnum, arcnum; // 图的当前顶点数和弧(边)数 GraphKind kind; // 图的种类标志
可编辑版
7
有向图邻接矩阵表示法特点:
➢有向图邻接矩阵不一定是对称矩阵;
➢有向图的弧数是矩阵中1的个数。
➢顶点v的出度:等于二维数组对应行中1的个数;
➢顶点v的入度:等于二维数组对应列中1的个数;
➢有向图的总弧数为非0元素个数。
网的邻接矩阵:
A[i][j]=
15
wij Vi邻接Vj,权值是Wij (0≤i,j≤n-1)

2
Vi与Vj不邻接 ∞ 5 4 6
4
68
A= 5 ∞ ∞ 8
4 ∞∞ 2
32
4
可编辑版
6 8 2∞
8
➢图的数组存储表示
#define INFINITY INT_MAX // 最大值∞ #define MAX_VERTEX_NUM 20 // 最大顶点个数 typedef enum {DG, DN, AG, AN} GraphKind;
可编辑版
12
➢为每个顶点vi的边链表建立一个头结点,存储在一维 数组中(即顶点表),以便随机访问任一顶点的边链表。 ➢因此,在邻接表中有两种结点:
链表结点 和 顶点结点
➢邻接表是一种顺序+ 链式存储结构。用顺序表存放顶 点,为每个顶点建立一个单链表,单链表中的结点表 示依附于该顶点的边或以该顶点为尾的弧。
可编辑版
5
无向图邻接矩阵表示法特点:
➢无向图邻接矩阵是对称矩阵,同一条边表示了两次,无 向图的总边数为非0元素个数的一半;
➢顶点v的度:等于二维数组对应行(或列)中1的个数;
➢判断两顶点v、u是否为邻接点:只需判断二维数组对应 分量是否为1;
➢顶点不变,在图中增加、删除边:只需对二维数组对应 分量赋值1或清0;
可编辑版
11
二、邻接表
➢邻接表是图(包括有向图和无向图)的链式存储结 构。
➢对于图中的每个顶点vi,把所有邻接于vi的各个顶点 链成一个单链表,称为边链表。
无向图中顶点vi的边链表中每个结点都对应一个与 vi关联的边;
有向图中顶点vi的边链表中每个结点都对应一个以 vi为始顶点的弧,因此称为出边表。
可编辑版
3
一、邻接矩阵
➢ 在存储图的结构时,至少要保存两类信息:
顶点的数据
顶点之间的关系
➢ 数组表示法:使用两个数组,其中一个用来存储顶 点的数据,另一个用来存储顶点之间的关系(弧), 表示弧的矩阵被称为邻接矩阵(二维数组)。
➢ 具有n个顶点的图G的邻接矩阵是具有如下性质的n
阶矩阵:
A[i][j]= 1 Vi邻接Vj (0≤i,j≤n-1)
➢设图的顶点数为 n ,存储图用一维数组, 数组元素有m
(m>=n)个,则G占用存储空间:m+n2;G占用存储空间
只与它的顶点数有关,与边数无关;适用于边稠密的图;
可编辑版
6
无向图的邻接矩阵为对称矩阵。
B A
F
C D
E
010010 100011 000101 001001 110000 011100
0 Vi与Vj不邻接
可编辑版
4
V1
V2
V1
V2
V3
V4
V3
V4
V5
v1 v2 v3 v4
v1 0 1 1 0
v2 0 0 0 0 v3 0 0 0 1 v4 1 0 0 0
01010 10 1 0 1 20 1 0 1
1 30 1 0 0
有向图G1 的邻接矩阵
无向图4 G002 1的邻1 接0矩阵
可编辑版
13
顶点数据结点(数组元素)由两个域组成:
➢ 数据域(data): 存储顶点名称或其他信息。 ➢ 链域(firstarc): 指向链表中第一个结点 (边)。
边链表的每个结点由3个域组成:
➢ 邻接点域(adjvex):指示与顶点 vi 邻接的顶点 在图中的位置。
➢ 链域(nextarc): 指示下一条边或弧的结点。 ➢ 数据域(info): 存储和边或弧相关的信息。
} MGraph;
可编辑版
10Biblioteka Baidu
邻接矩阵的数据类型定义
#define MaxV 100 //定义最大顶点数 typedef struct{
int vexes[MaxV]; //顶点表 int edges[MaxV][MaxV]; //邻接矩阵 int n,e; //顶点数n和边数e }MGraph;
相关文档
最新文档