第六章数据结构 图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
边用顶点的无序偶对(vi, vj)来表示,称顶点vi和顶 点vj互为邻接点,边(vi, vj)依附于顶点vi与顶点vj; 弧用顶点的有序偶对<vi, vj>来表示,有序偶对的第一 个结点vi被称为始点(或弧尾),在图中就是不带箭 头的一端;有序偶对的第二个结点vj被称为终点(或 弧头),在图中就是带箭头的一端。
V2
V4
(V1, V4),(V2, V4)} 顶点(V1, V3)与 (V3, V1)表示同一条边
2013-8-4
8
(3)顶点、边、弧、弧头、弧尾:图中,数据元素vi称为顶 点(vertex );P(vi, vj)表示在顶点vi和顶点vj之间有一条 直接连线。如果是在无向图中,则称这条连线为边; 如果是在有向图中,一般称这条连线为弧。
2013-8-4
7
G=( V, E )
V1 V2 V3 V4
顶点集合V={V1 , V2 , V3 , V4 }
弧的集合G={<V1 ,V3>, <V3 ,V4>,
<V2 ,V4>, <V4,V1>}
V1
V3
顶点集合V={V1 , V2 , V3 , V4 } 边的集合E={(V1, V3), (V1, V2),
顶点的出度=矩阵中对应该顶点的行中非零元 素的个数。 顶点的入度=矩阵中对应该顶点的列中非零元 素的个数。
2013-8-4
19
对有权值的网络图:
V1 V3 V1 V2 V3 V4
入度
1 0 1 2
出度
1 1 1 1
V1
V2 V2 V4 V3 V4
0
0 0 1
0
0 0 0
1
0 0 0
0
1 1 0
V1 V2 V3 V4
V={ 1 , 2 , 3 }
E={ <1,2> , <2,3> , <3,2> , <1,3> } 4
2 有向图
2013-8-4
3
2.图的相关术语
(1)无向图:在一个图中,如果任意两个顶点之 间的连线(称为边)是没有方向的,则称该图为无 向图。如图6.1(b)所示是一个无向图。 v1 v2 v3 边的集合为: v4 v5 E={(v1,v2),(v1,v4), (v2,v3),(v2,v5),(v3,v4),(v3, v5)}
10
V3
V1 ∞ V2 5
5
6
10
∞ ∞ 12
V3
V4
6
∞ ∞
∞
21
10 12
∞ ∞
2013-8-4
在C 语言中,实现邻接矩阵表示法的类型定义如下 所示:
#define MaxVertexNum 100 //最大顶点数设为100 #define VEXTYPE int //顶点类型设为int #define ADJTYPE int //边的权值设为整型 #define MAXLEN 40 typedef struct { otherdata……; //图中边的信息, VEXTYPE vexs[MAXLEN]; //图中顶点的信息 ADJTYPE arcs[MAXLEN][MAXLEN];//邻接矩阵 int vexnum,arcnum; int kind; //图的类型 }MGRAPH;
2013-8-4
11
(10)回路、简单路径、简单回路: 序列中顶点不重复出现的路径称为简单路径。 路径中第一个顶点与最后一个顶点相同的路径称为回路或 者环(cycle)。 除第一个顶点与最后一个顶点之外,其他顶点不重复出现 的回路称为简单回路,或者简单环。
(11) 子图:对于图G=(V,E),G’=(V’,E’),若存在V’ 是V的子集 ,E’是E的子集 ,则称图G’是G的一个子图. (12)连通的、连通图、连通分量 在无向图中,如果从一 个顶点vi到另一个顶点vj(i≠j)有路径,则称顶点vi 和vj 是连 通的。如果图中任意两顶点都是连通的,则称该图是连通 图.无向图的极大连通子图称为连通分量。
2013-8-4
机械工业出版社
1
6.1 图的基本概念
1.图的定义 • 图是由结点的有穷集合V和边的集合E组成。 其中,为了与树形结构加以区别,在图结构中 常常将结点称为顶点,边是顶点的有序偶对(二 个顶点间的连线),若两个顶点之间存在一条边, 就表示这两个顶点具有相邻关系。
2013-8-4
2
其形式化定义为: G=(V,E) V={vi| vi∈dataobject} E={( vi,vj)| vi, vj ∈V ∧P(vi, vj)}
(9) DFSTraverse(G,v)在图G中,从顶点v出发深 度优先遍历图G。 (10) BFSTtaverse(G,v)在图G中,从顶点v出发 广度优先遍历图G。 (11)LocateVex(G,u)在图G中找到顶点u,返回该顶 点在图中位置。 (12)FirstAdjVex(G,v)在图G中,返回v的第一个邻 接点。若顶点在G中没有邻接顶点,则返回“空”。 (13)NextAdjVex(G,v,w)在图G中,返回v的(相对 于w的)下一个邻接顶点。若w是v的最后一个邻接点, 则返回“空”。
2013-8-4
15
6.2 图的存储结构
(1)图的邻接矩阵表示法 (2)图的邻接表示法
2013-8-4
16
6.2.1 邻接矩阵
有n个顶点的图可用一个A[n][n]的矩阵来表示各顶点间 的相邻关系。 矩阵元素A[i][j]的值表示为顶点Vi(行)与顶点Vj(列)间的 关系: 1----表示顶点Vi到顶点Vj间有连线
2013-8-4
10
(7)顶点的度、入度、出度: 顶点的度(degree)是指依附于某顶点v的边数,通常记为TD (v)。 在有向图中,要区别顶点的入度与出度的概念。 顶点v的入度是指以顶点v为终点(弧带箭头的一端)的弧的数目。 记为ID(v) 顶点v出度是指以顶点v为始点的弧的数目,记为OD (v) 有向图中某顶点的度为:TD (vi)=ID (vi)+OD (vi)。 (8)边的权、网:与边有关的数据信息称为权(weight)。在实际 应用中,权值可以有某种含义。 边上带权的图称为网或网络(network)。 (9)路径、路径长度:顶点vp到顶点vq之间的路径(path)是指顶 点序列vp,vi1,vi2, …, vim,vq.。其中,(vp,vi1),(vi1,vi2),…,(vim,.vq) 分别为图中的边。路径上边的数目称为路径长度。
•A[i][j]=
0----表示顶点Vi到顶点Vj间无连线
•对于网图:
A[i][j]=
wij----表示顶点Vi到顶点Vj间边的权值
∞ ----表示顶点Vi到顶点Vj间无连线
2013-8-4
17
图的邻接矩阵表示法
V1 V2 V3 V4 V1 0 0 1 0
V1
V3
V2
V3 V2 V4 V4
0
0 1
2013-8-4
顶 点 V 的 集 合 为 : V={v1,v2,v3,v4,v5}
5
(2)有向图:在一个图中,如果任意两个顶点之间的 连线<vi, vj> (称为弧)是有方向的,则称该图为有向 图。
如图6.1(a)所示是一个有向图
v1 v2 顶 点 V 的 集 合 为 : V={v1,v2,v3,v4}
弧线的集合为: v3 v4 E={<v1,v2>,<v1,v3>, <v3,v4>,<v4,v1>} 6
2013-8-4
有向图
图百度文库
无向图
V1 V2 V3 V4 V1 V3
V2
V4
在有向图中,<V1,V3>表示从V1到V3的一条弧。
V1为弧尾或初始点,V3为弧头或终端点。
在无向图中,(V1,V3)表示V1和V3之间的一条边。
2013-8-4
9
(4)无向完全图:在一个无向图中,如果任意两顶点都 有一条直接边相连接,则称该图为无向完全图。可以 证明,在一个含有n个顶点的无向完全图中,有n(n-1)/2 条边。 (5)有向完全图:在一个有向图中,如果任意两顶点之 间都有方向互为相反的两条弧相连接,则称该图为有 向完全图。在一个含有n个顶点的有向完全图中,有 n(n-1)条边。 (6)稠密图、稀疏图 若一个图接近完全图,称为稠密图 (Dense Graph) ; 称 边 数 很 少 的 图 为 稀 疏 图 (Spares Graph)。
其中,G表示一个图,V是图G中顶点的集合,E 是图G中边的集合,集合E中P(vi,vj)表示顶点vi和 顶点vj之间有一条直接连线,即偶对(vi,vj)表示一 条边。
2013-8-4
3
图形结构——节点间的连结是任意的
1 4
V={ 1 , 2 , 3 , 4}
E={(1,2) , (1,3) , (1,4) , (2,3) 2 无向图 1 3 (3,4) , (2,4) }
2013-8-4
22
建立一个图的邻接矩阵存储的算法如下:
#define MAX 10000 //设∞为MAX MGRAPH create_mgraph() { int i,j,k,h; char b,t; MGRAPH mg; mg.kind=3; /*若为有向图、无向图、无向网,则mg.kind=1、2、4*/ printf("请输入顶点数和边数:"); scanf("%d,%d",&i,&j); mg.vexnum=i; mg.arcnum=j; for(i=0;i<mg.vexnum;i++) //输入顶点信息,建立顶点表 { printf(“第%d个顶点信息:”,i+1); scanf("%d",&mg.vexs[i]; } for(i=0;i<mg.vexnum;i++) //初始化邻接矩阵 for(j=0;j<mg.vexnum;j++) mg.arcs[i][j]=MAX; //若为无向图/网,则mg.arcs[i][j]=0 for(k=1;k<=mg.arcnum;k++) { printf("第%d条边的起始顶点编号和终止顶点编号;\n",k); scanf ("%d,%d",&i,&j ); while(i<0||i>=mg.vexnum||j<0||j>=mg.vexnum) { printf (" 编号超出范围,重新输入:"); scanf ("%d,%d",&i,&j); } printf ("此边的权值:"); scanf ("%d",&h); mg.arcs[i][j]=h;} return(mg); } 23 2013-8-4
0
0 0
0
0 0
1
1 0
V1 V2 V3 V4 V1 V1 V3 V2 V3 V2
2013-8-4
0 1 1 1
1 0 0 1
1 0 0 0
1 1 0 0 18
V4
V4
对于无向图,邻接矩阵为对称矩阵
邻接矩阵表示法对求顶点的度很方便。 •在无向图中: 顶点的度数=矩阵中对应该顶点的行或列中非 零元素的个数。 •在有向图中:
2013-8-4
13
图的基本操作
(1) CreatGraph(G)输入图G的顶点和边,建立图 G的存储。
(2)DestroyGraph(G)释放图G占用的存储空间。 (3)GetVex(G,v)在图G中找到顶点v,并返回顶 点v的相关信息。 (4)PutVex(G,v,value)在图G中找到顶点v,并 将value值赋给顶点v。 (5)InsertVex(G,v)在图G中增添新顶点v。 (6)DeleteVex(G,v)在图G中,删除顶点v以及所 有和顶点v相关联的边或弧。 (7)InsertArc(G,v,w)在图G中增添一条从顶点v 到顶点w的边或弧。 (8)DeleteArc(G,v,w)在图G中删除一条从顶点 v到顶点w的边或弧。 14 2013-8-4
2013-8-4
12
(13)强连通图、强连通分量 对于有向图来说,若图中 任意一对顶点vi和vj (i≠j) 均有从一个顶点vi 到另一个 顶点vj有路径,也有从vj 到vi的路径,则称该有向图 是强连通图。有向图的极大强连通子图称为强连通分 量。 (14)生成树 连通图G的生成树,是G的包含其全部n 个 顶点的一个极小连通子图。在生成树中添加任意一条 属于原图中的边必定会产生回路,若生成树中减少任 意一条边,则必然成为非连通的。 (15)生成森林 在非连通图中,由每个连通分量都可得 到一个极小连通子图,即一棵生成树。这些连通分量 的生成树就组成了一个非连通图的生成森林。
V1 V3 V1 V2 0 1 1 0 1 0 1 1
度数
3 2 1 2
20
V2
2013-8-4
V4
V3
V4
1
1
0
1
0
0
0
0
对有权值的网络图:
V1
6 10 V2 V4
V1 V2 V3 V4 V3
V1 ∞ ∞ V2 ∞ ∞ ∞ 10 ∞ 6 ∞ ∞ ∞ ∞ ∞ 12 ∞ ∞
12
V3 V4
V1 V2 V3 V4 V1 5 V2 12 V4 6