数据结构 图的基本知识点

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在无向图G中:
如果从顶点Vi 到顶点Vj至少有一条路径,则称Vi与Vj是连通 的。 如果图中任意两个顶点都连通,则称G为连通图,否则称为 非连通图。 任何连通图的连通分量只有一个,即其自身,而非连通图有 多个连通分量。
在非连通图G中,任何一个极大连通子图称为G的连通分量。
在一个连通图中,含有全部顶点的极小(边数最少)连通子图, 称为该连通图的生成树。(包含图的所有 n 个结点,但只含 图的 n-1 条边。在生成树中添加一条边之后,必定会形成回 路或环)
在非强连通图G中,任何一个极大强连通子图称为G的强
连通分量。 任何强连通图的强连通分量只有一个,即其自身,而非强
连通图有多个强连通分量。
有向图G和强连通分量示例:
8.权、带权图、有向网和无向网
在一个图中,各边(或弧)上可以带一个数值,这个数值称为 权。 这种每条边都带权的图称为带权图或网 有向网:带权有向图 无向网:带权无向图
在有向图中,顶点v的度又分为入度和出度两种:
以顶点v为终点(弧头)的弧的数目称为顶点v的入度,记 为ID(v); 以顶点v为起点(弧尾)的弧的数目称为顶点v的出度,记 为OD(v);
有向图顶点v的度为该顶点的入度和出度之和,即
D(v)=ID(v)+OD(v)
无论是有向图还是无向图,一个图的顶点数n、边 (弧)数e和每个顶点的度di之间满足以下的关系式:
无向图G1的二元组表示: V(G1)={V1, V2, V3, V4} E(G1)={(V1, V2),(V1, V3),(V1, V4),(V2, V3),(V2, V4),(V3, V4)} 有向图G3的二元组表示: V(G3)={V1, V2, V3} E(G3)={<V1, V2>,<V1, V3>,<V2, V3>,<V3, V2>}
1
V5
3 V4
4 V5
1、举例
有向图
V1 V2
以顶点V1为始点的弧的终点 顶点在数组中的下标
0 V1 1 2 ∧
邻接表表示
V3 V4
1 V2
2 V3 3 V4

3 0 ∧ ∧
顶点的出度
该顶点所在单链表中表结点个数
顶点的入度 查询整个邻接表中的表结点,与该顶点的序号(数 组下标)一致的表结点个数
5.路径、回路和路径长度
使(Vp, Vi1),(Vi1, Vi2),…,(Vin, Vq)均为图G的边,则该称顶
点的序列为顶点Vp 到顶点Vq 的路径。若G是有向图,则路径 是有向的。
在无向图G中,若存在一个顶点序列(Vp , Vi1 , Vi2 , … , Vin , Vq),
路径长度定义为路径上的边数或者弧的数目。
算法实现(无向图)
void CreateGraph(MGraph *g) { int i, j, v, e; scanf("%d %d", &g->vn, &g->en); /*输入顶点数和边数*/ for(v=0;v<g->vn;v++) scanf("%d", &g->vex[v]); /*顶点数据输入*/ for(i=0;i<g->vn;i++) for(j=0;j<g->vn;j++) g->arc[i][j]=0; /*邻接矩阵的初始值都为0*/ for(e=0;e<g->en;e++) /*共有g->en条边*/ { scanf("%d %d", &i, &j); /*指明有边的两个顶点的序号*/ g->arc[i][j]=1; /*有边赋值为1*/ g->arc[j][i]=1; /*建有向图时此句不要*/ } }
vextype vertex;
第8章

2013年7月22日
第8章 图
8.1 图的基本概念 8.2 图的基本存储结构 8.2.1 邻接距阵及其实现 8.2.2 邻接表及其实现 8.3 图的遍历 8.3.1 深度优先搜索遍历 8.3.2 广度优先搜索遍历 8.4 图的应用 8.4.1 连通图的最小生成树 8.4.2 拓扑排序
8.1 图的基本概念
8.2 图的基本存储结构
图需存储的信息:
V0 V2 V3 V4 V1
各顶点的数据
各个边(弧)的信息,包括:
哪两个顶点有边(弧)
若有权要表示出来
V0
V1
顶点数、边(弧)数
V2
V3
8.2.1 邻接矩阵及其实现
顶点数据存储:
一维数组(顺序存储)
边(弧)信息的存储:
邻接矩阵:图中n个顶点之间相邻关系的n阶方阵(即二 维数组a[n][n])
一、现实中的图
图最常见的应用是在交通运输和通信网络中找出造价
最低的方案。通信网络示例如下图所示:
二、图的定义
记为二元组形式: G= (V, E) 其中:
V是由顶点构成的非空有限集合,记为:V={V0, V1, V2, …Vn-1} E是由V中顶点的对偶构成的有限集合,记为:E={(V0, V2), (V3, V4), … },若E为空,则图中只有顶点而没有边。
1 n e D(vi ) 2 i 1
即在有向图或无向图中: 所有顶点度数之和 :边数 = 2 :1
3.完全图、稠密图和稀疏图
在图G中:
若G为无向图,任意两个顶点之间都有一条边,称G为无
向完全图。顶点数为n,无向完全图的边数: e=Cn2 =n(n1)/2 若G为有向图,任意两个顶点Vi, Vj之间都有弧<Vi,Vj> 、 <Vj,Vi> ,称G为有向完全图。如顶点数为n,有向完全图
3 2 3 2 ∧ ∧ 4 4 ∧ ∧
邻接表表示
2 V3 3 V4 4 V5
V4
V5
1
2

顶点的度:该顶点所在单链表中表结点个数 无向网
V1
权值
V2
0 V1 1 V2 1 2 3 4 ∧
2 1
0
1 0 1
2
1 4 5
2
3 2 21Biblioteka 3 3 1 ∧ ∧4
4
5
1


4 3
V4
V3
5 邻接表表示
2 V3
4、建图运算
建图——就是完成图类型变量中各个成员值的创建过程。
例:建一个如图所示的无向图 0 1
0 1 0 1 0
执行时输入数据:
6 1 2 3 4 1 3 2 4 3 4
5 0 1 0 1 0 1 0 2 0 1 0 1 1 0 1 0 1 0 0 1 3 4 0 1 1 0 0 1 分析: 2 各顶点信息:键盘输入 2 各边信息:邻接矩阵,顶点间有边值为1, 无边值为0 顶点数、边数:键盘输入
typedef struct arcnode{
int adjvex;
struct arcnode *next; } ArcNode, *Arc;
表结点类型
3、邻接表存储的图类型定义 (2)顶点结点类型
顶点结点:
顶点信息
vertex firstarc 链表头指针(指向第一个表结点)
typedef struct vexnode{
1.邻接点
在无向图中,若存在一条边(Vi, Vj),则称Vi和Vj 互为邻接点(Adjacent)
在有向图中,若存在一条弧<Vi, Vj >,则称Vi为此
弧的起点,称Vj为此弧的终点,称Vi邻接到Vj,Vj 邻接自Vi,Vi和Vj互为邻接点。
2.顶点的度、入度和出度
在无向图中,与顶点v相邻接的边数称为该顶点的 度,记为D(v)。
3、邻接矩阵存储的图类型定义
# define MAX 100 /* MAX为图中顶点最多个数 */ typedef int vextype; /* vextype为顶点的数据类型 */ typedef struct{ vextype vex[MAX]; /* 一维数组存储顶点信息 */ int arc[MAX][MAX]; /*邻接矩阵存储边(弧)信息 */ int vn, en; /* vn顶点数和en边数 */ }MGraph; /* 图类型 */ 注:MGraph 既可以表示有向图、无向图,也可以表示有 整型权的网
1
0
0
V1 V2 V3 V4 V5 2 1 4 3
V4 V2
V1 V2 5 邻接矩阵表示
0 2 ∞ 2 0 1 ∞ 1 0
4 ∞ 3
∞ 5 1
V3
V3 V4
1
V5
4 ∞ 3
∞ 5 1
0 ∞
∞ 0
V5
1、举例
有向图
V1 V2
V1 邻接矩阵表示 V2 V3 V4
V1 V2 V3 V4 0 1 1 0
邻接矩阵中元素值情况(规定自身无边、无弧): 无向图 有向图 0 1 vi与vj无边 vi与vj有边
a [i][j]={

a [i][j]={
0 1
vi到vj无弧 vi到vj有弧
w vi与vj有边(或vi到vj有弧) W 表示边上的权值; 0 表示vi与vj是同一个顶点 ∞ 表示一个计算机允许的、大于所有边上权值的数。
a [i][j]={
∞或0
vi与vj无边(或vi到vj无弧)
1、举例
无向图
V1 V2
V1 V2 V3 V4 V5 V1 V2
V3
0
1
0
1
0
1
0 1
0
1 0
1
0 1
0
1 0
1
1 0
邻接矩阵表示
V5
V3
V4
V4
特点: 对称 行或列方向的非零元素(或1)的个数为此顶点的度 无向网
V1
V5
0
1
若一条路径中不出现重复顶点,则称此路径为简单路径。 若一条路径的起点和终点相同(Vp=Vq)称为回路或环。 除了起点和终点相同外,其余顶点不相同的回路,称为简单 回路或简单环。
例如,在无向图G1中: 顶点序列(V1, V2, V3, V4)是一条从顶点V1到顶
点V4,长度为3的简单路径;
0 0 0 0
0
1
0
0
0
0
1
0
V3
V4
特点:
不一定对称
行方向的非零元素(或1)的个数为此顶点的出度 列方向的非零元素(或1)的个数为此顶点的入度
2、邻接矩阵法特点
邻接矩阵法优点: 容易实现图的操作,如:求某顶点的度、判断顶点之间是否 有边(弧)、找顶点的邻接点等等。 邻接矩阵法缺点: n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。 对稀疏图而言尤其浪费空间。
顶点序列(V1, V2, V4, V1, V3)是一条从顶点V1到
顶点V3,长度为4的路径,但不是简单路径;
顶点序列(V1, V2, V3, V1)是一条长度为3的简单 回路。 在有向图G3中: 顶点序列(V2, V3, V2)是一个长度为2的有向简单 环。
6.连通、连通分量和连通图、生成树
2、邻接表法特点
邻接表的优点: 空间效率高;容易寻找顶点的邻接点;
邻接表的缺点:
判断任意两顶点间是否有边或弧,需搜
索两结点对应的单链表,没有邻接矩阵
方便。
3、邻接表存储的图类型定义 (1)表(边)结点——表示边(或弧)信息的链表中结点
表结点:
邻接点序号 (下标) adjvex next adjvex 下一个邻接 点地址 w next 权值
的弧数:
e=Pn2 =n(n1) 例如,无向图G1就是4个顶点无向完全图。 若一个图接近完全图,则称其为稠密图;反之,若一个图含 有很少条边或弧(即e<<n2),则称其为稀疏图。
4.子图
若有图G=(V, E)和G′=(V′, E′) 且V′ 是V的子集,即V′V , E′是E的子集,即 E′ E 则称图G′为图G的子图。
8.2.2 邻接表及其实现
是顺序与链接相结合的图的存储方式
所有顶点组成一个数组,为每个顶点建立一个单链表
有两部分组成:
表头——顶点数组(存放顶点信息)
表体——单链表(存放与顶点相关的边或弧的信息)
1、举例
无向图
V1 V2 0 V1 1 V2 V3 1 0 1 0
与顶点V1相邻接的顶点 在数组中的下标
图G1和G2为连通图
非连通图G4
A
E F I K C D G J
非连通图G4的三个连通分量
B
A E B F G
I K C D
J
连通图G5
A B
连通图G5的两棵生成树
A B A B
C
D
C
D
C
D
7.强连通、强连通分量和强连通图
在有向图G中:
存在从顶点Vi 到顶点Vj的路径,也存在从顶点Vj 到顶点Vi 的路径,则称Vi与Vj是强连通的。 如果图中任意两个顶点都是强连通,则称G为强连通图, 否则称为非强连通图。
图G是由一个顶点集V和一个边集E构成的数据结构。
其中对偶可以表示成: (Vi, Vj)—无序的对偶称为边,即(Vi, Vj)=(Vj, Vi) ,其图称为 无向图 <Vi, Vj>—有序的对偶称为弧,即<Vi, Vj> ≠<Vj, Vi>,则称 Vi为弧尾,称Vj为弧头,该图称为有向图
有向图和无向图示例:
相关文档
最新文档