- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章 图
7.2.1 邻接矩阵
1. 图的邻接矩阵表示
在邻接矩阵表示中,除了存放顶点本身信息外,还用 一个矩阵表示各个顶点之间的关系。若(i,j)∈E(G) 或〈i,j〉∈E(G),则矩阵中第i行第j列元素值为1,否则 为0 。
图的邻接矩阵定义为:
1 若(i,j)∈E(G)或〈i,j〉∈E(G)
A[i][j]=
<v3,v4>, <v5,v4>}
无向图G1
有向图G2
第七章 图 7.1.2 图的基本术语
1. 有向图和无向图 2. 完全图、稠密图、稀疏图 3. 度、入度、出度 4. 子图 5. 路径 6. 连通图 7. 权和网
第七章 图
7.2 图的存储结构
图是一种结构复杂的数据结构,表现在不仅各个顶 点的度可以千差万别,而且顶点之间的逻辑关系也错 综复杂。从图的定义可知,一个图的信息包括两部分, 即图中顶点的信息以及描述顶点之间的关系(边或者 弧)的信息。因此无论采用什么方法建立图的存储结 构,都要完整、准确地反映这两方面的信息。 下面介绍几种常用的图的存储结构。
第七章 图
例如:对于下图中的无向图G1,对应顶点集和边集为: V(G1)={v1,v2,v3,v4,v5}; E(G1)={(v1,v2),(v1,v4),(v2,v3),(v3,v4),(v3,v5),(v2,v5)}
对于下图中的有向图G2,对应顶点集和边集为: V(G2)={v1,v2,v3,v4,v5}; E(G2)={<v1,v2>, <v1,v3>, <v2,v3>, <v2,v5>, <v3,v2>,
/ * 图的边(弧)数 */
typedef char vextype;
/ * 顶点的数据类型 * /
typedef float adjtype;
/ * 权值类型 * /
typedef struct
{vextype vexs[n];
adjtype arcs[n][n];
}graph;
第七章 图
4. 建立无向图的邻接矩阵 void creatadj(graph &g)
第七章 图
第7章 图
数据结构(C描述)
第七章 图7.1 图的基本概念 Nhomakorabea目
7.2 图的存储结构
录 7.3 图的遍历
7.4 图的生成树和最小生成树
7.5 图的应用
第七章 图
7.1 图的基本概念
图(Graph)是一种比线性表和树结构更复杂的数据结构。
➢在线性表中,数据元素之间仅有线性关系,每 个数据元素只有一个直接前驱和直接后继;
{ int i, j,k ;
for (k=0; k<n; k++)
g.vexs[k]=getchar();
//输入顶点信息
for (i=0; i<n; i++ )
for (j=0; j<n; j++)
g.arcs[i][j]=0;
//初始化邻接矩阵
第七章 图
for (k=1; k<=e; k++) { scanf(“%d%d”,&i,&j);
(1)矩阵是对称的; (2)第i行或第i 列1的个数为顶点i 的度; (3)矩阵中1的个数的一半为图中边的数目; (4)很容易判断顶点i 和顶点j之间是否有边 相连(看矩阵中i行j列值是否为1)。
第七章 图
3. 从有向图的邻接矩阵可以得出如下结论
(1) 矩阵不一定是对称的; (2) 第i 行中1的个数为顶点i 的出度; (3) 第i列中1的个数为顶点 i的入度; (4) 矩阵中1的个数为图中弧的数目; (5) 很容易判断顶点i 和顶点j 是否有弧相连.
➢在树形结构中,数据元素之间有着明显的层次 关系结点间具有分支层次关系,每一层上的结 点只能和上一层中的至多一个结点相关,但可 能和下一层的多个结点相关。
第七章 图
而在图状结构中,任意两个结点之间都可能相 关,即结点之间的邻接关系可以是任意的。因 此,图状结构被用于描述各种复杂的数据对象 ,在自然科学、社会科学和人文科学等许多领 域有着非常广泛的应用。
0
其它情形
第七章 图
例如, 对图7-8所示的无向图和有向图,它们的邻接 矩阵见图7-9。
1
2
4
3
无向图G3
0101 1011 0101 1110
G3的邻接矩阵
图 7-9 邻接矩阵表示
第七章 图
1
2
3
有向图G4
011 001 100
G4 的邻接矩
图 7-9 邻接矩阵表示
第七章 图
2. 从无向图的邻接矩阵可以得出如下结论
第七章 图
7.1.1 图的定义
图(Graph)是由非空的顶点集合和一个描述顶点之 间关系的边(或者弧)的集合组成,其形式化定义 为:
G=(V,E) V={vi| vi∈VertexType} E={( vi,vj)| vi,vj ∈V }
其中,G表示一个图,V是图G中顶点的集合,E是 图G中边的集合,集合E中(vi,vj)表示顶点vi和顶点vj 之间有一条直接连线,即偶对(vi,vj)表示一条边。
//输入一条边(i,j)
g.arcs[i][j]=1;g.arcs[j][i]=1;
}
}
该算法的时间复杂度为O(n2)。
第七章 图
5.建立有向图的邻接矩阵 void creatadj(graph &g) { int i, j,k ;
for (k=0; k<n; k++) g.vexs[k]=getchar(); for (i=0; i<n; i++ ) for (j=0; j<n; j++) g.arcs[i][j]=0;
//输入顶点信息 //初始化邻接矩阵
第七章 图
for (k=1; k<=e; k++) { scanf(“%d%d”,&I,&j); //输入一条弧<i,j> g.arcs[i][j]=1; }
(b)网G5的邻接矩阵
图 7-10 网及邻接矩阵示意图
第七章 图
3. 图的邻接矩阵数据类型描述
用邻接矩阵表示法表示图,除了存储用 于表示顶点间相邻关系的邻接矩阵外, 通常还需要用一个顺序表来存储顶点信 息。其形式说明如下:
第七章 图
# define n 6
/ * 图的顶点数 * /
# define e 8
第七章 图
4. 网的邻接矩阵表示
类似地可以定义网的邻接矩阵为: wij 若(i,j)∈E(G)或〈i,j〉∈E(G)
A[i][j]= 0 若i=j ∞ 其它情形
第七章 图
网及网的邻接矩阵见图7-10。
6
1
2
39
145 7 8
3
4
2
(a)网G5
0 6 13 60 8 9 1 0 2 4 8 20 7 3 9 4 70