数据结构第七章图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void CreateGraph(AdjList *g,int m[][MAXVEX],int n){/*n为顶点总数*/ int i,j;PArcNode p; *g=(AdjList)malloc(sizeof(VGraph));/*初始化邻接表*/ (*g)->edges=0; (*g)->vexs=n; for(i=0;i<n;i++){ (*g)->lists[i].head=NULL;/*边表头指针初始化*/ for(j=n-1;j>=0;j--) if(m[i][j]!=0) { /*矩阵元素不为0,则在边表中生成一个结点*/ p=(PArcNode)malloc(sizeof(ArcNode)); p->adjvex=j; p->next=(*g)->lists[i].head;/*从链表头部插入新结点*/ (*g)->lists[i].head=p;(*g)->edges++; }}}
v1 v3 v5 v2 v4
v1 v5 v1 v3 v2 v4 v2
v3
v4
6
7.1.1图的定义
连通图:在无向图中,若从顶点vi到顶点vj有路径存在,则 称vi和vj是连通的。如果无向图中任意两个顶点都是连通的, 则称该无向图为连通图。否则,就是非连通图。无向图中 的极大连通子图称为该图的连通分量。 推论5:连通图的连通分量就是它本身。 强连通图:在有向图中,若一对顶点vi和vj(vi≠vj)存在从 vi到vj和从vj到vi的有向路径,则称vi和vj是连通的。若有向 图中任意两个顶点vi和vj(vi≠vj)之间都是连通的,则称该 有向图为强连通图。有向图中的极大强连通子图称为强连 弧 通分量。
9
7.2 图的存储结构
7.2.1 邻接矩阵 邻接矩阵是表示顶点之间相邻关系的矩阵。 设G=(V,E)是一个具有n个顶点的图。它的顶点集 合V={v0,v1,…,vn-1},则顶点间的关系E可用如下形 式的矩阵A描述。 对于A中的每一个元素aij满足:
1 , vi 与v j 相邻且具有边或弧相连 aij 0 ,其它
19
7.2.2 邻接表
【例7-6】为图7-2(b)所示的图G1建立邻接表和逆 邻接表。
data head 0 v1 1 v2 2 3 v3 v4
v2的下标
1 0 1
3
^
来自百度文库^ ^
data head 0 v1 1 v2 2 3 v3 v4
1 0 0
^
2
^
^ ^
^
20
7.2.2 邻接表
2.邻接表的操作
(1)创建邻接表
(8)删除边
void DeleteArc(AdjMetrix g,int u,int v){ if(u<0 || u>g->vexs || v<0 || v>g->vexs){ printf("参数u或v超出范围!\n"); return ;} g->arcs[u][v]=0; }
17
7.2.2 邻接表
v3
3
7.1.1图的定义
完全图:含有n个顶点和条边的无向图称为完全图。 在完全图中,任意两个顶点之间均有边相连 推论1:具有n个顶点的无向图最多有条边。 有向完全图:含有n个顶点和n(n-1)条弧的有向图 称为有向完全图。在有向完全图中,任意两个顶点 之间均有两条方向相反的弧。 推论2:具有n个顶点的有向图最多有n(n-1)条弧。
5
7.1.1图的定义
路径:在图G中,从顶点vi出发,经过一系列的边或弧能够 到达顶点vj,则称顶点vi到顶点vj的顶点序列为从顶点vi到 顶点vj的路径。该路径上所包含的边的数目称为路径长度 简单路径:若路径上各顶点互不重复,则称这样的路径为 简单路径。 环或回路:若路径上第一个顶点和最后一个顶点相同,则 称这样的路径为环或回路。 子图:对于图G={V,E}和图G´={V´,E´},若存在V´ V且 边 顶点 E´ E,则称图G´是图G的子图。
13
7.2.1 邻接矩阵
2.邻接矩阵的操作 (1)创建邻接矩阵 void CreateGraph(AdjMetrix g,int m[][MAXVEX],DataType d[],int n){ int i,j; g->vexs=n; for(i=0;i<n;i++){ g->data[i]=d[i]; for(j=0;j<n;j++) g->arcs[i][j]=m[i][j]; }}
第七章 图
1
7.1 图的基本概念
7.1.1图的定义
图中的数据元素称为顶点。在顶点集合V中,第i个顶点记 作vi 图中两个顶点vi和vj之间有关联关系,称作顶点vi和vj之间 有一条边。在边集合E中,第k条边记作ek=<vi,vj>。 图是由顶点的非空有限集合与顶点间关系集合构成的数据 结构。记作G=(V,E)。其中,V为顶点集合,E为顶点间关 系——边的集合。 无向图:由没有方向的边构成的图称为无向图。 无向图中的边由顶点的无序偶对组成,因此,在无向图中, 顶点偶对<vi,vj>与顶点偶对<vj,vi>表示同一条边,记作 (vi,vj)。
边v2v5
对角元皆为0
11
7.2.1 邻接矩阵
对于带权图(网),邻接矩阵A中的元素定义为:
, vi与v j相邻且具有边或弧相连 w aij ij ,其它
【例7-4】对于图7-5(b)所示的网,请给出它的邻 接矩阵。
13 8 12 3 7 10 A 15 6 7
2
7.1.1图的定义
有向图:由有方向的边构成的图称为有向图。 弧:有向图中的边由顶点的有序偶对组成。顶点偶 对<vi,vj>表示从顶点vi指向顶点vj的一条有向边, 也称为弧。顶点vi是有向边的始点,也称为弧尾。 顶点vj是有向边的终点,也称为弧头。
边
v1 v3 v5 v2 v4
顶点
弧
v1 v4
v2
14
7.2.1 邻接矩阵
(3)取第一个邻接点
int GetFirst(AdjMetrix g,int k){ int i; if(k<0 || k>g->vexs){ printf("参数k超出范围!\n");return -1;} for(i=0;i<g->vexs;i++) if(g->arcs[k][i]==1) return i; return -1; }
15
7.2.1 邻接矩阵
(4)取下一个邻接点
int GetNext(AdjMetrix g,int k,int t){ int i; if(k<0 || k>g->vexs || t<0 || t>g->vexs) { printf("参数k或t超出范围!\n"); return NULL; } for(i=t+1;i<g->vexs;i++) if(g->arcs[k][i]==1) return i; return -1; }
邻接表是图的链式存储结构。邻接表由边表和顶点表组成 边表:对图中的每个顶点建立的单链表,单链表中存放与 同一个顶点相邻接的邻接点,相当于邻接矩阵中的一行 顶点表:存放图中每个顶点的信息以及指向该顶点边表的 头指针。顶点表通常采用顺序存储结构。 边表的结点结构: adjvex next adjvex为邻接点在顶点表中的序号,next指向下一个邻接点 的指针。 顶点表的结点结构:data存放顶点信息,head为边表头指针
16
7.2.1 邻接矩阵
(7)插入边
void InsertArc(AdjMetrix g,int u,int v,weight w){ if(u<0 || u>g->vexs || v<0 || v>g->vexs){ printf("参数u或v超出范围!\n");return ;} g->arcs[u][v]=w; }
10
7.2.1 邻接矩阵
【例7-2】对于图7-2(a)所示的无向图,请给出它 的邻接矩阵,并根据邻接矩阵计算顶点v2的度。
v1 v 2 V v3 v4 v5 v1 v1 0 v2 1 A v3 1 v4 0 v5 0 v2 v3 v4 v5 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 边 v2 v5 v4 的 度 2
1 2 3 7 8 4 6 5
2 3 4 1 6 5 7 8
v1
v4
v1
v2
v3
v2
7
7.1.1图的定义
权:图中边或弧上附带的数据称为权。 网:带权的图称为网。 生成树:包含连通图全部顶点的极小连通子图称作该图的 生成树。即以最少的边连接连通图中所有顶点。 推论6:有n个顶点的连通图,它的生成树一定包含n个顶点 和n-1条边。若加上一条边则构成环,若减去一条边则是非 北京 连通图。 130
700 郑州 500 武汉 1000 900 广州 800 上海 350 天津 700 徐州 600
南昌
8
7.1.2 图的抽象数据类型
ADT Graph 数据元素集合:具有相同性质的称为顶点的有限数据元素集合,以及称为弧或边 的有限集合。 基本操作: 创建图(CreateGraph):按顶点和弧的定义构造图 查找顶点(LocateVex):返回指定顶点在图中的位置 取顶点值(GetVex):返回指定顶点的值 给顶点赋值(PetVex):给指定顶点赋值 取第一个邻接点(FirstAdjVex):取顶点的第一个邻接点 取下一个邻接点(NextAdjVex):取顶点的下一个邻接点 插入顶点(InsertVex):在图中插入新顶点 删除顶点(DeleteVex):在图中删除指定顶点及相关的弧 插入弧(InsertArc):在图中插入一条新弧 删除弧(DeleteArc):在图中删除指定的弧 深度优先遍历(DFSTraverse):对图进行深度优先遍历 广度优先遍历(BFSTraverse):对图进行广度优先遍历
12
7.2.1 邻接矩阵
用C语言描述的邻接矩阵:
#define MAXVEX 50 /*最大顶点个数*/ typedef int weight; /*权值*/ typedef struct{ weight arcs[MAXVEX][MAXVEX];/*邻接矩阵*/ DataType data[MAXVEX];/*顶点信息*/ int vexs; /*顶点数*/ }MGraph,*AdjMetrix;
data head
逆邻接表:结构与邻接表完全相同,只是边表中每个结点 存放的是每条弧的弧尾顶点。
18
7.2.2 邻接表
C语言描述的邻接表:
#define MAXVEX 50 typedef struct arc{/*边表结点类型*/ int adjvex;/*顶点序号*/ struct arc* next;/*指向下一个邻接点*/ }ArcNode,*PArcNode; typedef struct{/*顶点表结点类型*/ DataType data;/*顶点信息*/ ArcNode* head;/*边表头指针*/ }VexNode; typedef struct{/*邻接表类型*/ VexNode lists[MAXVEX];/*顶点表*/ int edges,vexs;/*边数,顶点数*/ }VGraph,*AdjList;
v1
v1
v2
v3
v2
v3
4
7.1.1图的定义
邻接点:在无向图中,若存在一条边(vi, vj),则称vi和vj互 为邻接点。称边(vi, vj)依附于顶点vi和vj或称边(vi, vj)与顶点 vi和vj相关联。 顶点的度:在无向图中,与顶点v相关联的边数称为顶点v 的度,记作TD(v)。 在有向图中,顶点的度又分为顶点的入度和顶点的出度。 顶点的入度是指以顶点v为弧头的弧的数目,记作ID(v); 顶点的出度是指以顶点v为弧尾的弧的数目,记作OD(v)。 顶点v的度等于顶点v的入度和出度之和,即 TD(v)=ID(v)+OD(v)。 推论3:对于无向图,其总度数是总边数的两倍。 推论4:对于有向图,其总入度、总出度和总边数相等。
v1 v3 v5 v2 v4
v1 v5 v1 v3 v2 v4 v2
v3
v4
6
7.1.1图的定义
连通图:在无向图中,若从顶点vi到顶点vj有路径存在,则 称vi和vj是连通的。如果无向图中任意两个顶点都是连通的, 则称该无向图为连通图。否则,就是非连通图。无向图中 的极大连通子图称为该图的连通分量。 推论5:连通图的连通分量就是它本身。 强连通图:在有向图中,若一对顶点vi和vj(vi≠vj)存在从 vi到vj和从vj到vi的有向路径,则称vi和vj是连通的。若有向 图中任意两个顶点vi和vj(vi≠vj)之间都是连通的,则称该 有向图为强连通图。有向图中的极大强连通子图称为强连 弧 通分量。
9
7.2 图的存储结构
7.2.1 邻接矩阵 邻接矩阵是表示顶点之间相邻关系的矩阵。 设G=(V,E)是一个具有n个顶点的图。它的顶点集 合V={v0,v1,…,vn-1},则顶点间的关系E可用如下形 式的矩阵A描述。 对于A中的每一个元素aij满足:
1 , vi 与v j 相邻且具有边或弧相连 aij 0 ,其它
19
7.2.2 邻接表
【例7-6】为图7-2(b)所示的图G1建立邻接表和逆 邻接表。
data head 0 v1 1 v2 2 3 v3 v4
v2的下标
1 0 1
3
^
来自百度文库^ ^
data head 0 v1 1 v2 2 3 v3 v4
1 0 0
^
2
^
^ ^
^
20
7.2.2 邻接表
2.邻接表的操作
(1)创建邻接表
(8)删除边
void DeleteArc(AdjMetrix g,int u,int v){ if(u<0 || u>g->vexs || v<0 || v>g->vexs){ printf("参数u或v超出范围!\n"); return ;} g->arcs[u][v]=0; }
17
7.2.2 邻接表
v3
3
7.1.1图的定义
完全图:含有n个顶点和条边的无向图称为完全图。 在完全图中,任意两个顶点之间均有边相连 推论1:具有n个顶点的无向图最多有条边。 有向完全图:含有n个顶点和n(n-1)条弧的有向图 称为有向完全图。在有向完全图中,任意两个顶点 之间均有两条方向相反的弧。 推论2:具有n个顶点的有向图最多有n(n-1)条弧。
5
7.1.1图的定义
路径:在图G中,从顶点vi出发,经过一系列的边或弧能够 到达顶点vj,则称顶点vi到顶点vj的顶点序列为从顶点vi到 顶点vj的路径。该路径上所包含的边的数目称为路径长度 简单路径:若路径上各顶点互不重复,则称这样的路径为 简单路径。 环或回路:若路径上第一个顶点和最后一个顶点相同,则 称这样的路径为环或回路。 子图:对于图G={V,E}和图G´={V´,E´},若存在V´ V且 边 顶点 E´ E,则称图G´是图G的子图。
13
7.2.1 邻接矩阵
2.邻接矩阵的操作 (1)创建邻接矩阵 void CreateGraph(AdjMetrix g,int m[][MAXVEX],DataType d[],int n){ int i,j; g->vexs=n; for(i=0;i<n;i++){ g->data[i]=d[i]; for(j=0;j<n;j++) g->arcs[i][j]=m[i][j]; }}
第七章 图
1
7.1 图的基本概念
7.1.1图的定义
图中的数据元素称为顶点。在顶点集合V中,第i个顶点记 作vi 图中两个顶点vi和vj之间有关联关系,称作顶点vi和vj之间 有一条边。在边集合E中,第k条边记作ek=<vi,vj>。 图是由顶点的非空有限集合与顶点间关系集合构成的数据 结构。记作G=(V,E)。其中,V为顶点集合,E为顶点间关 系——边的集合。 无向图:由没有方向的边构成的图称为无向图。 无向图中的边由顶点的无序偶对组成,因此,在无向图中, 顶点偶对<vi,vj>与顶点偶对<vj,vi>表示同一条边,记作 (vi,vj)。
边v2v5
对角元皆为0
11
7.2.1 邻接矩阵
对于带权图(网),邻接矩阵A中的元素定义为:
, vi与v j相邻且具有边或弧相连 w aij ij ,其它
【例7-4】对于图7-5(b)所示的网,请给出它的邻 接矩阵。
13 8 12 3 7 10 A 15 6 7
2
7.1.1图的定义
有向图:由有方向的边构成的图称为有向图。 弧:有向图中的边由顶点的有序偶对组成。顶点偶 对<vi,vj>表示从顶点vi指向顶点vj的一条有向边, 也称为弧。顶点vi是有向边的始点,也称为弧尾。 顶点vj是有向边的终点,也称为弧头。
边
v1 v3 v5 v2 v4
顶点
弧
v1 v4
v2
14
7.2.1 邻接矩阵
(3)取第一个邻接点
int GetFirst(AdjMetrix g,int k){ int i; if(k<0 || k>g->vexs){ printf("参数k超出范围!\n");return -1;} for(i=0;i<g->vexs;i++) if(g->arcs[k][i]==1) return i; return -1; }
15
7.2.1 邻接矩阵
(4)取下一个邻接点
int GetNext(AdjMetrix g,int k,int t){ int i; if(k<0 || k>g->vexs || t<0 || t>g->vexs) { printf("参数k或t超出范围!\n"); return NULL; } for(i=t+1;i<g->vexs;i++) if(g->arcs[k][i]==1) return i; return -1; }
邻接表是图的链式存储结构。邻接表由边表和顶点表组成 边表:对图中的每个顶点建立的单链表,单链表中存放与 同一个顶点相邻接的邻接点,相当于邻接矩阵中的一行 顶点表:存放图中每个顶点的信息以及指向该顶点边表的 头指针。顶点表通常采用顺序存储结构。 边表的结点结构: adjvex next adjvex为邻接点在顶点表中的序号,next指向下一个邻接点 的指针。 顶点表的结点结构:data存放顶点信息,head为边表头指针
16
7.2.1 邻接矩阵
(7)插入边
void InsertArc(AdjMetrix g,int u,int v,weight w){ if(u<0 || u>g->vexs || v<0 || v>g->vexs){ printf("参数u或v超出范围!\n");return ;} g->arcs[u][v]=w; }
10
7.2.1 邻接矩阵
【例7-2】对于图7-2(a)所示的无向图,请给出它 的邻接矩阵,并根据邻接矩阵计算顶点v2的度。
v1 v 2 V v3 v4 v5 v1 v1 0 v2 1 A v3 1 v4 0 v5 0 v2 v3 v4 v5 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 边 v2 v5 v4 的 度 2
1 2 3 7 8 4 6 5
2 3 4 1 6 5 7 8
v1
v4
v1
v2
v3
v2
7
7.1.1图的定义
权:图中边或弧上附带的数据称为权。 网:带权的图称为网。 生成树:包含连通图全部顶点的极小连通子图称作该图的 生成树。即以最少的边连接连通图中所有顶点。 推论6:有n个顶点的连通图,它的生成树一定包含n个顶点 和n-1条边。若加上一条边则构成环,若减去一条边则是非 北京 连通图。 130
700 郑州 500 武汉 1000 900 广州 800 上海 350 天津 700 徐州 600
南昌
8
7.1.2 图的抽象数据类型
ADT Graph 数据元素集合:具有相同性质的称为顶点的有限数据元素集合,以及称为弧或边 的有限集合。 基本操作: 创建图(CreateGraph):按顶点和弧的定义构造图 查找顶点(LocateVex):返回指定顶点在图中的位置 取顶点值(GetVex):返回指定顶点的值 给顶点赋值(PetVex):给指定顶点赋值 取第一个邻接点(FirstAdjVex):取顶点的第一个邻接点 取下一个邻接点(NextAdjVex):取顶点的下一个邻接点 插入顶点(InsertVex):在图中插入新顶点 删除顶点(DeleteVex):在图中删除指定顶点及相关的弧 插入弧(InsertArc):在图中插入一条新弧 删除弧(DeleteArc):在图中删除指定的弧 深度优先遍历(DFSTraverse):对图进行深度优先遍历 广度优先遍历(BFSTraverse):对图进行广度优先遍历
12
7.2.1 邻接矩阵
用C语言描述的邻接矩阵:
#define MAXVEX 50 /*最大顶点个数*/ typedef int weight; /*权值*/ typedef struct{ weight arcs[MAXVEX][MAXVEX];/*邻接矩阵*/ DataType data[MAXVEX];/*顶点信息*/ int vexs; /*顶点数*/ }MGraph,*AdjMetrix;
data head
逆邻接表:结构与邻接表完全相同,只是边表中每个结点 存放的是每条弧的弧尾顶点。
18
7.2.2 邻接表
C语言描述的邻接表:
#define MAXVEX 50 typedef struct arc{/*边表结点类型*/ int adjvex;/*顶点序号*/ struct arc* next;/*指向下一个邻接点*/ }ArcNode,*PArcNode; typedef struct{/*顶点表结点类型*/ DataType data;/*顶点信息*/ ArcNode* head;/*边表头指针*/ }VexNode; typedef struct{/*邻接表类型*/ VexNode lists[MAXVEX];/*顶点表*/ int edges,vexs;/*边数,顶点数*/ }VGraph,*AdjList;
v1
v1
v2
v3
v2
v3
4
7.1.1图的定义
邻接点:在无向图中,若存在一条边(vi, vj),则称vi和vj互 为邻接点。称边(vi, vj)依附于顶点vi和vj或称边(vi, vj)与顶点 vi和vj相关联。 顶点的度:在无向图中,与顶点v相关联的边数称为顶点v 的度,记作TD(v)。 在有向图中,顶点的度又分为顶点的入度和顶点的出度。 顶点的入度是指以顶点v为弧头的弧的数目,记作ID(v); 顶点的出度是指以顶点v为弧尾的弧的数目,记作OD(v)。 顶点v的度等于顶点v的入度和出度之和,即 TD(v)=ID(v)+OD(v)。 推论3:对于无向图,其总度数是总边数的两倍。 推论4:对于有向图,其总入度、总出度和总边数相等。