数据结构 第七章图课件
合集下载
《数据结构》大本课件-7

是一条简单回路;“v2→v1→v2→v4→v5→v3→v1→v2”是一条回路。
V1
4. 无向完全图、有向完全图
V1
V2
. 有n个顶点的无向图,最多可有n(n−1)/2
V2
V3
条边。如果一个有n个顶点的无向图,拥有
n(n−1)/2条边,那么就称该图为“无向完全图”。
可见,一个无向完全图的每个不同顶点对之 V3
度与出度之和,即:D(vi)=ID(vi)+OD(vi)。
V2
V3
. 比如在有向图里,由于弧< v2, v1>和< v3, v1>都以顶点v1为
弧头,所以顶点v1的入度ID(v1)=2;由于弧< v1, v2>以顶点v1为弧尾, 所以顶点v1的出度OD(v1)=1;于是,顶点v1的度为:
V4
V5
D(v1)=ID(v1)+OD(v1)=2+1=3
其他顶点 。
V6
. 比如,如图所示为一个非连通图,因为从顶点
v1没有路径可以到达顶点v7。
. 比如,该图的两个连通分量如图(a)和(b)所示。 V3
V1 V3
V6
V2
V7
V8
V4
V5
V9
(a)
(b)
7. 边的权、网络
. 可给图的边或弧依附上某种数值,这种
38 V1
与图的边或弧相关的数值被称为“权”。 44
V4
V4
V5
间,都存在有一条边。
. 如图所示是一个无向完全图,因为它有4个顶点,且它有4(4−1)/2=6条边,符合无
向完全图的定义。
. 对于有n个顶点的有向图,最多可以有n(n−1)条弧。如果一个有n个顶点的有向图,
数据结构第七章图PPT课件

第7章 图
CAC - 2
CAC - 3
7.1 图的定义和术语
7.1.1 图的定义和术语
1. 图的定义(graph)
图G由两个集合构成,记作G=<V,E> ,其中V是顶点的非空有限集合,
E是顶点间关系----边的有限集合,边是顶点的无序对或有序对集合。 。
【例】 V0
V1
V2
V3
V4
无序对(vi,vj): 用连接顶点vi、vj的线段
V0
V1
V0
V1
V2
V3
V2
V3
两个强连通分量
CAC - 17
练习
具有n个顶点的强连通图至少有多少条边?是什么形状?
分析:强连通图是针对有向图而言的。由于强连通图要求 图中任何2个顶点之间能够连通,因此每个顶点至少要有一条 以该顶点为终点(弧头)和出发点(弧尾)的弧,每个顶点 的入度和出度至少各为1,即顶点的度至少为2。
边或弧
G2=<V2,E2> V2={ v0 ,v1,v2,v3 } E2={ <v0,v1 > , <v0,v2 >, <v2,v3 >,<v3,v0 > }
CAC - 6
7.1.1 图的定义和术语
2. 图的相关术语 (1)无向图:若图G中所有边是没有方向的,则称G为无向图。 (2)有向图:若图G中所有顶点间的连线是有方向的,则称G为有向图。 (3)顶点:数据元素Vi称为顶点。 (4)边和弧:P(Vi,Vj)表示在顶点Vi和Vj之间有线相连,如果是无向图, 则称该线为边;在有向图中,则称该连线为弧。边用顶点的无序偶对(Vi, Vj)表示,弧用有序偶对< Vi,Vj >表示。 (5)弧头和弧尾:有序偶对的第一个结点称为始点(或弧尾,即不带箭 头的一端),有序偶对的第二个结点称为终点(或弧头,即带箭头的一 端)。
CAC - 2
CAC - 3
7.1 图的定义和术语
7.1.1 图的定义和术语
1. 图的定义(graph)
图G由两个集合构成,记作G=<V,E> ,其中V是顶点的非空有限集合,
E是顶点间关系----边的有限集合,边是顶点的无序对或有序对集合。 。
【例】 V0
V1
V2
V3
V4
无序对(vi,vj): 用连接顶点vi、vj的线段
V0
V1
V0
V1
V2
V3
V2
V3
两个强连通分量
CAC - 17
练习
具有n个顶点的强连通图至少有多少条边?是什么形状?
分析:强连通图是针对有向图而言的。由于强连通图要求 图中任何2个顶点之间能够连通,因此每个顶点至少要有一条 以该顶点为终点(弧头)和出发点(弧尾)的弧,每个顶点 的入度和出度至少各为1,即顶点的度至少为2。
边或弧
G2=<V2,E2> V2={ v0 ,v1,v2,v3 } E2={ <v0,v1 > , <v0,v2 >, <v2,v3 >,<v3,v0 > }
CAC - 6
7.1.1 图的定义和术语
2. 图的相关术语 (1)无向图:若图G中所有边是没有方向的,则称G为无向图。 (2)有向图:若图G中所有顶点间的连线是有方向的,则称G为有向图。 (3)顶点:数据元素Vi称为顶点。 (4)边和弧:P(Vi,Vj)表示在顶点Vi和Vj之间有线相连,如果是无向图, 则称该线为边;在有向图中,则称该连线为弧。边用顶点的无序偶对(Vi, Vj)表示,弧用有序偶对< Vi,Vj >表示。 (5)弧头和弧尾:有序偶对的第一个结点称为始点(或弧尾,即不带箭 头的一端),有序偶对的第二个结点称为终点(或弧头,即带箭头的一 端)。
数据结构严蔚敏7章图ppt课件

InfoType *info;
}VNode,AdjList[MAX_V];
}ArcNode;
typedef struct //图的邻接表类型
{ AdjList vertices; //存储图中所有顶点的数组
int vexnum,arcnum; //存储图的顶点数目和边(弧)的数目
int kind; //图的种类标志
返回
表结点
adjvex nextarc info
表头结点
data firstarc
typedef struct ArcNode typedef struct
{ int adjvex;
{ VertexType data;
struct ArcNode *nextarc; ArcNode *firstarc;
}ArcCell,AdjMatrix[MAX_V][MAX_V];
typedef struct
{ VertexType vex[MAX_V]; //顶点信息数组(如顶点编号等)
AdjMatrix arcs;
//图的邻接矩阵
int vexnum,arcnum; //图的顶点数和边(弧)的数目
GraphKind kind;//图的种类标志
A CB F DE G (a) 有向图G1
A BC D EF (b) 无向图G2
返回
2 几个常用术语 可以证明,对于具有n个顶点的无向图的边和具有n个
顶点的有向图的弧的最大数目分别为n(n-1)/2和n(n-1)。 称具有n(n-1)/2条边的无向图为完全图(completed
grahp)。 称具有n(n-1)条弧的有向图为完全有向图 称边或弧的数目e<nlogn的图为稀疏图(sparse
数据结构《第七章、图》PPT课件

由于“弧”是有方向的,因此称由顶点集 和弧集构成的图为有向图。
例如: G1 = (V1, VR1)
其中 A
V1={A, B, C, D, E}
B
E VR1={<A,B>, <A,E>,
C
D
<B,C>, <C,D>, <D,B>, <D,A>, <E,C> }
若<v, w>VR 必有<w, v>VR, 则称 (v,w) 为顶点 v 和顶点 w 之间存在一条边。
A
B
EB
E
CF
CF
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小连 通子图,称该极小连通子图为此连通图的 生成树。
B A
F
C D
E
对非连通图,则 称由各个连通分 量的生成树的集 合为此非连通图 的生成森林。
基本操作
结构的建立和销毁 对顶点的访问操作
插入或删除顶点 插入和删除弧
7.2 图的存储表示
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示 三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
一、图的数组(邻接矩阵)存储表示
定义:矩阵的元素为
{ 0 (i,j)VR
Aij= 1 (i,j)VR
B A
F
C D
E
010010 100010 000101 001001 110000 011100
含有 e=n(n-1) 条弧的有向图称作 有 向完全图;
若边或弧的个数 e<nlogn,则称作 稀疏图,否则称作稠密图。
假若顶点v 和顶点w 之间存在一条边, 则称顶点v 和w 互为邻接点, 边(v,w) 和顶点v 和w 相关联。
例如: G1 = (V1, VR1)
其中 A
V1={A, B, C, D, E}
B
E VR1={<A,B>, <A,E>,
C
D
<B,C>, <C,D>, <D,B>, <D,A>, <E,C> }
若<v, w>VR 必有<w, v>VR, 则称 (v,w) 为顶点 v 和顶点 w 之间存在一条边。
A
B
EB
E
CF
CF
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小连 通子图,称该极小连通子图为此连通图的 生成树。
B A
F
C D
E
对非连通图,则 称由各个连通分 量的生成树的集 合为此非连通图 的生成森林。
基本操作
结构的建立和销毁 对顶点的访问操作
插入或删除顶点 插入和删除弧
7.2 图的存储表示
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示 三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
一、图的数组(邻接矩阵)存储表示
定义:矩阵的元素为
{ 0 (i,j)VR
Aij= 1 (i,j)VR
B A
F
C D
E
010010 100010 000101 001001 110000 011100
含有 e=n(n-1) 条弧的有向图称作 有 向完全图;
若边或弧的个数 e<nlogn,则称作 稀疏图,否则称作稠密图。
假若顶点v 和顶点w 之间存在一条边, 则称顶点v 和w 互为邻接点, 边(v,w) 和顶点v 和w 相关联。
课件c语言:数据结构第七章图

含有 e=n(n-1) 条弧的有向图称作 有 向完全图;
若边或弧的个数 e<nlogn,则称作
稀疏图,
13
1
1
4
2
3
4
2
3
无向完全图 有向完全图
15 A 9
11
B 7 21
E
3
C2 F
权:与图的边或 弧相关的数。
网:带权的图。
有两个图G=(V,{E}) 和
图 G=(V,{E}),
245
无向完全图 5
3
6
1
3
6
图与子图 例
例
245
1 57
1
3
6
32
46
G2
顶点5的度:3 顶点2的度:4
G1
顶点2入度:1 出度:3 顶点4入度:1 出度:0
例
路径:1,2,3,5,6,3 路径长度:5
245
简单路径:1,2,3,5
回路:1,2,3,5,6,3,1
1
3
6
简单回路:3,5,6,3
G1
31.12.2020
h
6
7.1 图的定义和术语
主
7.2 图的存储结构(***)
要
7.3 图的遍历(***)
内 容
7.4 图的连通性问题 最小生成树(***)
7.5 有向无环图及其应用
拓扑排序 关键路径
7.6 最短路径
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成的 数据结构。
Graph = (V , R ) 其中,VR={<v,w>| v,w∈V 且 P(v,w)}
C D
E
A F
数据结构精品PPT课件第七章 图(ppt文档)

V0
V1
V2
V3
V4
V0
V1
V2
V3
练例习
245
1
3
6
G1
图G1中:V(G1)={1,2,3,4,5,6} E(G1)={<1,2>, <2,1>, <2,3>, <2,4>, <3,5>, <5,6>, <6,3>}
例 1
57
32
46
G2
图G2中:V(G2)={1,2,3,4,5,6,7} E(G1)={(1,2), (1,3), (2,3), (2,4),(2,5), (5,6), (5,7)}
1
V1 0 0 1 0
1
V2 0 0 1 1
2
V3 0 0 0 1
V4 1 1 0 0 2
出度
1 2 1 2
0
0 1 01 1
1
2
G1.arcs
1
10
0 1
1 0
0 1
3
1010
0
0 1 01
1
G2.arcs 1 0 1
2
000
无向图的邻接矩阵是对称的; 有向图的邻接矩阵可能是不对称的。
V1={v0 ,v1,v2,v3,v4 } E1={(v0,v1),(v0,v3),(v1,v2),(v1,v4),(v2,v3)(v2,v4)}
7.1图的定义和术语
例
V0
V1
V2
V3
有序对<vi,vj> : 用以为vi起点、以vj 为终点的有向线段表 示,称为有向边或弧 ;
G2=<V2,E2>
《数据结构》课件——第7章 图
邻接矩阵
arc=
V1
1
0
1
1
V1
V2
V2 0 1 0 0
V3 1 1 0 0
无向图的邻接矩阵的特点?
主对角线为 0 且一定是对称矩阵。
无向图的邻接矩阵
V0
V3
V1
V2
如何求顶点 Vi 的度?
012 3
vertex= V0 V1 V2 V3
V0 V1 V2 V3
V0 0 1 0 1 arc= V1 1 0 1 1
V0
V1
V2
V3
V4
生成树
V0 V3
V1
V6
生成森林
V5
V4
V2
V0
V3 V0 V4
V1 V2
V4
V1 V3 V6 V5
V2
案例:六度空间理论
➢ 你和任何一个陌生人之间所间隔的 人不会超过6个,也就是说,最多通 过6个中间人你就能够认识任何一个 陌生人。
图的抽象数据类型定义
图是一种与具体应用密切相关的数据结构,它的基本操作往往随 应用不同而有很大差别。下面给出一个图的抽象数据类型定义的例子 ,简单起见,基本操作仅包含图的遍历,针对具体应用,需要重新定 义其基本操作。
V0 V3
V1 V6
V5
V4
V2
V0
V1
V4 V3
V2 V6
连通分量是对无向图的一种划分
V5
图的基本术语
➢ 强连通图:在有向图中,对图中任意一对顶点vi和vj (i≠j),若 从顶点vi到顶点vj和从顶点vj到顶点vi均有路径,则称该有向图是
强连通图。 ➢ 强连通分量:非强连通图的极大强连通子图。
数据结构 (C语言版)课件:第7章_图
非简单图
2020/9/30
3
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 无向图和有向图
● 无向图:如果图中顶点 vi 和 vj 之间的边无方向,则称这条边为无向边, 用无序偶对 (vi, vj) 表示,称该图为无向图。
● 有向图:如果图中顶点 vi 和 vj 之间的边有方向,则称这条边为有向边, 用有序偶对 <vi, vj> 表示,称该图为有向图。
无论有向图还是无向图,顶点数 n、边 数 e 和度数之间满足:
2020/9/30
8
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 权和网
● 权:权通常是指对图中边赋予的有意义的数值量。在实际应用中,权 可以有具体的含义。
● 网:如果将图中的每条边上都赋上一个权值,则称这种图为网,或称 为有权图 。
2020/9/30
6
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 稀疏图和稠密图
● 稀疏图:边数很少的图称为稀疏图,如果 e 表示图中的边数,n 表示 图中的顶点数,则 e<nlogn。
● 稠密图:边数很多的图称为稠密图,如果 e 表示图中的边数,n 表示 图中的顶点数,则 e≥nlogn。
2020/9/30
无向完全图
有向完全图
5
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 邻接和依附
● 邻接:对图 G=(V, VR),如果边 (vi, vj)∈VR,则称顶点 vi 和 vj 互为邻 接点;如果弧<vi, vj>∈VR,则称顶点 vi 邻接到 vj,vj 邻接自 vi。
● 依附:对图 G=(V, VR),如果边 (vi, vj)∈VR 或弧 <vi, vj>∈VR,则称 边 (vi, vj) 或弧 <vi, vj> 依附于顶点 vi 和 vj。
2020/9/30
3
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 无向图和有向图
● 无向图:如果图中顶点 vi 和 vj 之间的边无方向,则称这条边为无向边, 用无序偶对 (vi, vj) 表示,称该图为无向图。
● 有向图:如果图中顶点 vi 和 vj 之间的边有方向,则称这条边为有向边, 用有序偶对 <vi, vj> 表示,称该图为有向图。
无论有向图还是无向图,顶点数 n、边 数 e 和度数之间满足:
2020/9/30
8
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 权和网
● 权:权通常是指对图中边赋予的有意义的数值量。在实际应用中,权 可以有具体的含义。
● 网:如果将图中的每条边上都赋上一个权值,则称这种图为网,或称 为有权图 。
2020/9/30
6
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 稀疏图和稠密图
● 稀疏图:边数很少的图称为稀疏图,如果 e 表示图中的边数,n 表示 图中的顶点数,则 e<nlogn。
● 稠密图:边数很多的图称为稠密图,如果 e 表示图中的边数,n 表示 图中的顶点数,则 e≥nlogn。
2020/9/30
无向完全图
有向完全图
5
7.1 图的逻辑结构
7.1.1 图的定义
● 相关概念 邻接和依附
● 邻接:对图 G=(V, VR),如果边 (vi, vj)∈VR,则称顶点 vi 和 vj 互为邻 接点;如果弧<vi, vj>∈VR,则称顶点 vi 邻接到 vj,vj 邻接自 vi。
● 依附:对图 G=(V, VR),如果边 (vi, vj)∈VR 或弧 <vi, vj>∈VR,则称 边 (vi, vj) 或弧 <vi, vj> 依附于顶点 vi 和 vj。
数据结构课件 第7章 图
例如下列定义的有向图如右图所示。 G1=(V1, VR1) 其中:V1 = {A, B, C, D, E} VR1={<A,B>,<A,E>,<B,C>,<C,D>, <D,B>,<D,A>,<E,C>}
例如下列定义的无向图如右所示。 G2=(V2, VR2) 其中:V2={A, B, C, D, E, F} VR2={(A,B),(A,E),(B,E),(C,D) ,(D,F),(B,F),(C,F) }
图的构造 操作的实现框架
Status CreateGraph (MGraph &G) { //采用数组(邻接矩阵)表示法,构造图G Scanf(&G.kind); Switch(G.kind) case DG:return CreatDG; //构造有向图G case DN:return CreatDN; //构造有向网G case UDG:return CreatUDG; //构造有向图G case UDN:return CreatUDN; //构造有向网G default:return ERROR; }
7.2 图的存储表示 7.2.1 图的数组(邻接矩阵)存储表示 假设图中顶点数为n,则邻接矩阵 定义为
网的邻接矩阵的定义为,当vi到vj有弧相邻接时, aij 的值应为该弧上的权值,否则为∞。 将图的顶点信息存储在一个一维数组中,并将它的邻 接矩阵存储在一个二维数组中即构成图的数组(邻接矩阵) 表示。
FirstAdjVex(G, v); 初始条件:图 G 存在,v 是 G 中某个顶点。 操作结果:返回 v 的第一个邻接点。 若该顶点在 G 中没有邻接点,则返回“空”。 NextAdjVex(G, v, w); 初始条件:图 G 存在,v 是 G 中某个顶点, w 是 v 的邻接顶点。 操作结果:返回 v 的(相对于 w 的)下一个邻接 点。若 w 是 v 的最后一个邻接点,则返回"空"。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
vertex firstin firstout
顶点结点结构
顶点值域 指针域 指针域
tailvex headvex hlink
tlink
info
弧结点结构
弧尾结点 弧头结点 指针域 指针域 弧上信息
A B
C
在十字链表中容易求 得顶点的出度和入度
0 A
0 1
∧
2 0∧∧
1 B 2 C
2 1∧
0 2∧∧
一个n个顶点的图的邻接表表示由表头结点表与 边表两部分构成。
头结点结构为: data firstarc
指向链表的第一个结点
顶点的数据元素的值
表结点结构为:
adjvex
nextarc
info
邻接点域(位置) 指向下一条边(或弧)
1)无向图
V0 V2
v0 v1 v2 3 3 0 ∧ 2 0 ∧ 1 ∧
7.3.1 深度优先搜索
按照深度方向搜索 ,它类似于树的先根遍历。 深度优先算法的基本思想是: (1)从图中某个顶点v0出发,首先访问v0。 (2)找出刚访问过的顶点vi的第一个未被访问 的邻接点,然后访问该顶点。重复此步骤,直 到当前的顶点没有未被访问的邻接点为止。 (3)返回前一个访问过的顶点,找出该顶点的 下一个未被访问的邻接点,访问该顶点。转2。
2)广度优先遍历每一个连通图 从顶点v开始广度优先遍历连通图 1) 初始化队列Q 2) 访问顶点v,并使其访问位为true ,并入队列Q 3) 若队列不空
a)出队列→v b)求v的第一个邻接点w c)若w存在 ●w未被访问,则访问w并使其访问位为true ,并入队列
V1
V3
v3
1
0 ∧
若无向图中有n 个顶点、e条边,则它的邻接表需n 个头结点和2e个表结点。显然,在边稀疏(e<<n(n-1)/2) 的情况下,用邻接表表示图比邻接矩阵节省存储空间, 顶点vi的度恰为第i个链表中的结点数
2)有向图的邻接表
v0
V0
V2
2 ∧ 3 ∧ 3 ∧ 0 ∧
v1 v2
V1
V3
7.3 图的遍历
从图中某个顶点出发遍历图,访遍图中其 余顶点,并且使图中的每个顶点仅被访问一次 的过程。 为了保证图中的各顶点在遍历过程中访问且 仅访问一次,需要为每个顶点设一个访问标志, 用以标示图中每个顶点是否被访问过,访问标 志用数组visited[n]来表示。
图的遍历方法有两种: 深度优先搜索和广度优先搜索
二、图的邻接表存储表示
邻接表(Adjacency List)是图的一种顺序存 储与链式存储结合的存储方法。 邻接表表示法类似于树的孩子链表表示法。 就是对于图G中的每个顶点vi,将所有邻接于vi的 顶点vj链成一个单链表,这个单链表就称为顶点 vi的邻接表,再将所有点的邻接表表头放到数组 中,就构成了图的邻接表。
C
F
C
F
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小 连通子图,称该极小连通子图为此连通图 的生成树。 B A F E C D
对非连通图,则称 由各个连通分量的 生成树的集合为此 非连通图的生成森 林。
7.2 图的存储表示
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示
三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
一、图的数组(邻接矩阵)表示法
所谓邻接矩阵(Adjacency Matrix)的存 储结构,就是用一维数组存储图中顶点的信息, 用矩阵表示图中各顶点之间的邻接关系。假设 图G=(V,E)有n个确定的顶点,即V= {v0,v1,…,vn-1},则表示G中各顶点相邻关系为一 个n×n的矩阵
C F
个顶点相同的路径。
若图G中任意两个顶 点之间都有路径相通, 则称此图为连通图; A B A
F E
B
C D
C
D
F
E
若无向图为非连通图, 则图中各个极大连通 子图称作此图的连通 分量。
对有向图, 若任意两个顶点之间都存在
一条有向路径,则称此有向图为强连通图。 否则,其各个强连通子图称作它的 强连通分量。 A B E B A E
假若顶点v 和顶点w 之间存在一条边, 则称顶点v 和w 互为邻接点
边(v,w) 和顶点v 和w 相关联。 和顶点v 关联的边的数目定义为边的度。
例如: 右侧图中
TD(B) = 3 TD(A) = 2
B
C
A F E
D
对有向图来说,由于弧有方向性,则
A
有入度和出度之分
B
C F
E
顶点的出度: 以顶点 v 为弧尾的弧的数目; 顶点的入度: 以顶点v 为弧头的弧的数目。 顶点的度(TD)= 出度(OD)+入度(ID)
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成
的数据结构。 Graph = (V, R ) R={VR} 其中,VR={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为 弧尾,w 为弧头。
由于“弧”是有方向的,因此称由顶点 集和弧集构成的图为有向图。
(2)依次以v0的未被访问的邻接点为出发点, 深度优先搜索图,直至图中所有与v0有路径相 通的顶点都被访问。
若此时图中还有顶点未被访问,则另选图中 一个未被访问的顶点作为起始点,重复上述深度 优先搜索过程,直至图中所有顶点均被访问过为 止。
void DFS(Graph G, int v0) { // 从顶点v出发,深度优先搜索遍历连通图 G visited[v0] = TRUE; Visit (v0); for(w=FirstAdjVex(G, v0); w!=-1; w=NextAdjVex(G, v0,w)) if (!visited[w]) DFS(G, w); // 对v的尚未访问的邻接顶点w // 递归调用DFS } // DFS
(B, E), (C, D), (D, F), (B, F), (C, F) }
由顶点集和边 集构成的图称 作无向图。
B A F
C D E
名词和术语
网、子图
完全图、稀疏图、稠密图
邻接点、度、入度、出度 路径、路径长度、简单路径、简单回路
连通图、连通分量、 强连通图、强连通分量 生成树、生成森林
15
Aij=
{ 1 (i,j)VR
C D
0 (i,j)VR
B A F
E
0 1 0 0 1 0
1 0 0 0 1 1
0 0 0 1 0 1
0 0 1 0 0 1
1 1 0 0 0 0
0 0 1 1 0 0
有向图的邻接矩阵 为非对称矩阵
0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0
顶点值域
vertex
指针域
firstedge 顶点结点结构
标记域
Mark
顶点位置
ivex
指针域
ilink
顶点位置
jvex
指针域
jlink
边上信息
info
边表结点结构
V0
V2
V1
v0 v1
V3
0 1 0 2 ∧ 0 ∧ 3
1 ∧ 3 ∧ v2 v3
练习:
已知如右图所示的有向图,请给出该图的 1. 每个顶点的入/出度 5 1 2. 邻接矩阵 3. 邻接表 6 4. 逆邻接表 2 4 3
对连通图,从起始点V到其余 各顶点必定存在路径。
w2 w1 V w7 w6 w5 w3
其中,V->w1, V->w2, V->w8
的路径长度为1;
V->w7, V->w3, V->w5 的路径长度为2; V->w6, V->w4 的路径长度为3。
w8
w4
【思路】初始化:1)对每一个结点访问位为false
例如:
0 1
a
2 3 4
b
5
6
g f
c
7
d
e
8
h
0 1
k
2 3 4 5 6 7 8
访问标志: F F F F F F F F F T T T T T T T T T 访问次序:
a c h d k f e b g
采用递归的形式说明,则深度优先搜索连通 子图的的基本思想可表示为: (1)访问出发点v0。
v3
第i个链表中的结点个数只是顶点vi的出度,为求 入度,必须遍历整个邻接表。在所有链表中其邻接点 域的值为i的结点的个数是顶点vi的入度。 有时,为了便于确定顶点的入度或以顶点vi为头 的弧,可以建立一个有向图的逆邻接表,即对每个顶 点vi 建立一个链接以vi为头的弧的链表。
3)有向图的逆邻接表
A
21
2
9 11
弧或边带权的图
B
3
7
E
分别称作有向网或 无向网。
C
F B A
设图G=(V,{VR}) 和图 G=(V,{VR}), 且 VV, VRVR, 则称 G 为 G 的子图。
B
C
E
F
假设图中有 n 个顶点,e 条边,则
含有 e=n(n-1)/2 条边的无向图称作 完全图; 含有 e=n(n-1) 条弧的有向图称作 有向完全图; 若边或弧的个数 e<nlogn,则称作 稀疏图,否则称(B) = 2
TD(B) = 3
设图G=(V,{VR})中的一个顶点序列 { u=vi,0,vi,1, …, vi,m=w}中,(vi,j-1,vi,j)VR 1≤j≤m, 则称从顶点u 到顶点w 之间存在一条路径。 路径上边的数目称作路径长度。 如:从A到F长度为 3 简单路径:指序列中顶 的路径{A,B,C,F} 点不重复出现的路径。 A 简单回路:指序列中 B E 第一个顶点和最后一
顶点结点结构
顶点值域 指针域 指针域
tailvex headvex hlink
tlink
info
弧结点结构
弧尾结点 弧头结点 指针域 指针域 弧上信息
A B
C
在十字链表中容易求 得顶点的出度和入度
0 A
0 1
∧
2 0∧∧
1 B 2 C
2 1∧
0 2∧∧
一个n个顶点的图的邻接表表示由表头结点表与 边表两部分构成。
头结点结构为: data firstarc
指向链表的第一个结点
顶点的数据元素的值
表结点结构为:
adjvex
nextarc
info
邻接点域(位置) 指向下一条边(或弧)
1)无向图
V0 V2
v0 v1 v2 3 3 0 ∧ 2 0 ∧ 1 ∧
7.3.1 深度优先搜索
按照深度方向搜索 ,它类似于树的先根遍历。 深度优先算法的基本思想是: (1)从图中某个顶点v0出发,首先访问v0。 (2)找出刚访问过的顶点vi的第一个未被访问 的邻接点,然后访问该顶点。重复此步骤,直 到当前的顶点没有未被访问的邻接点为止。 (3)返回前一个访问过的顶点,找出该顶点的 下一个未被访问的邻接点,访问该顶点。转2。
2)广度优先遍历每一个连通图 从顶点v开始广度优先遍历连通图 1) 初始化队列Q 2) 访问顶点v,并使其访问位为true ,并入队列Q 3) 若队列不空
a)出队列→v b)求v的第一个邻接点w c)若w存在 ●w未被访问,则访问w并使其访问位为true ,并入队列
V1
V3
v3
1
0 ∧
若无向图中有n 个顶点、e条边,则它的邻接表需n 个头结点和2e个表结点。显然,在边稀疏(e<<n(n-1)/2) 的情况下,用邻接表表示图比邻接矩阵节省存储空间, 顶点vi的度恰为第i个链表中的结点数
2)有向图的邻接表
v0
V0
V2
2 ∧ 3 ∧ 3 ∧ 0 ∧
v1 v2
V1
V3
7.3 图的遍历
从图中某个顶点出发遍历图,访遍图中其 余顶点,并且使图中的每个顶点仅被访问一次 的过程。 为了保证图中的各顶点在遍历过程中访问且 仅访问一次,需要为每个顶点设一个访问标志, 用以标示图中每个顶点是否被访问过,访问标 志用数组visited[n]来表示。
图的遍历方法有两种: 深度优先搜索和广度优先搜索
二、图的邻接表存储表示
邻接表(Adjacency List)是图的一种顺序存 储与链式存储结合的存储方法。 邻接表表示法类似于树的孩子链表表示法。 就是对于图G中的每个顶点vi,将所有邻接于vi的 顶点vj链成一个单链表,这个单链表就称为顶点 vi的邻接表,再将所有点的邻接表表头放到数组 中,就构成了图的邻接表。
C
F
C
F
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小 连通子图,称该极小连通子图为此连通图 的生成树。 B A F E C D
对非连通图,则称 由各个连通分量的 生成树的集合为此 非连通图的生成森 林。
7.2 图的存储表示
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示
三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
一、图的数组(邻接矩阵)表示法
所谓邻接矩阵(Adjacency Matrix)的存 储结构,就是用一维数组存储图中顶点的信息, 用矩阵表示图中各顶点之间的邻接关系。假设 图G=(V,E)有n个确定的顶点,即V= {v0,v1,…,vn-1},则表示G中各顶点相邻关系为一 个n×n的矩阵
C F
个顶点相同的路径。
若图G中任意两个顶 点之间都有路径相通, 则称此图为连通图; A B A
F E
B
C D
C
D
F
E
若无向图为非连通图, 则图中各个极大连通 子图称作此图的连通 分量。
对有向图, 若任意两个顶点之间都存在
一条有向路径,则称此有向图为强连通图。 否则,其各个强连通子图称作它的 强连通分量。 A B E B A E
假若顶点v 和顶点w 之间存在一条边, 则称顶点v 和w 互为邻接点
边(v,w) 和顶点v 和w 相关联。 和顶点v 关联的边的数目定义为边的度。
例如: 右侧图中
TD(B) = 3 TD(A) = 2
B
C
A F E
D
对有向图来说,由于弧有方向性,则
A
有入度和出度之分
B
C F
E
顶点的出度: 以顶点 v 为弧尾的弧的数目; 顶点的入度: 以顶点v 为弧头的弧的数目。 顶点的度(TD)= 出度(OD)+入度(ID)
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成
的数据结构。 Graph = (V, R ) R={VR} 其中,VR={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为 弧尾,w 为弧头。
由于“弧”是有方向的,因此称由顶点 集和弧集构成的图为有向图。
(2)依次以v0的未被访问的邻接点为出发点, 深度优先搜索图,直至图中所有与v0有路径相 通的顶点都被访问。
若此时图中还有顶点未被访问,则另选图中 一个未被访问的顶点作为起始点,重复上述深度 优先搜索过程,直至图中所有顶点均被访问过为 止。
void DFS(Graph G, int v0) { // 从顶点v出发,深度优先搜索遍历连通图 G visited[v0] = TRUE; Visit (v0); for(w=FirstAdjVex(G, v0); w!=-1; w=NextAdjVex(G, v0,w)) if (!visited[w]) DFS(G, w); // 对v的尚未访问的邻接顶点w // 递归调用DFS } // DFS
(B, E), (C, D), (D, F), (B, F), (C, F) }
由顶点集和边 集构成的图称 作无向图。
B A F
C D E
名词和术语
网、子图
完全图、稀疏图、稠密图
邻接点、度、入度、出度 路径、路径长度、简单路径、简单回路
连通图、连通分量、 强连通图、强连通分量 生成树、生成森林
15
Aij=
{ 1 (i,j)VR
C D
0 (i,j)VR
B A F
E
0 1 0 0 1 0
1 0 0 0 1 1
0 0 0 1 0 1
0 0 1 0 0 1
1 1 0 0 0 0
0 0 1 1 0 0
有向图的邻接矩阵 为非对称矩阵
0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0
顶点值域
vertex
指针域
firstedge 顶点结点结构
标记域
Mark
顶点位置
ivex
指针域
ilink
顶点位置
jvex
指针域
jlink
边上信息
info
边表结点结构
V0
V2
V1
v0 v1
V3
0 1 0 2 ∧ 0 ∧ 3
1 ∧ 3 ∧ v2 v3
练习:
已知如右图所示的有向图,请给出该图的 1. 每个顶点的入/出度 5 1 2. 邻接矩阵 3. 邻接表 6 4. 逆邻接表 2 4 3
对连通图,从起始点V到其余 各顶点必定存在路径。
w2 w1 V w7 w6 w5 w3
其中,V->w1, V->w2, V->w8
的路径长度为1;
V->w7, V->w3, V->w5 的路径长度为2; V->w6, V->w4 的路径长度为3。
w8
w4
【思路】初始化:1)对每一个结点访问位为false
例如:
0 1
a
2 3 4
b
5
6
g f
c
7
d
e
8
h
0 1
k
2 3 4 5 6 7 8
访问标志: F F F F F F F F F T T T T T T T T T 访问次序:
a c h d k f e b g
采用递归的形式说明,则深度优先搜索连通 子图的的基本思想可表示为: (1)访问出发点v0。
v3
第i个链表中的结点个数只是顶点vi的出度,为求 入度,必须遍历整个邻接表。在所有链表中其邻接点 域的值为i的结点的个数是顶点vi的入度。 有时,为了便于确定顶点的入度或以顶点vi为头 的弧,可以建立一个有向图的逆邻接表,即对每个顶 点vi 建立一个链接以vi为头的弧的链表。
3)有向图的逆邻接表
A
21
2
9 11
弧或边带权的图
B
3
7
E
分别称作有向网或 无向网。
C
F B A
设图G=(V,{VR}) 和图 G=(V,{VR}), 且 VV, VRVR, 则称 G 为 G 的子图。
B
C
E
F
假设图中有 n 个顶点,e 条边,则
含有 e=n(n-1)/2 条边的无向图称作 完全图; 含有 e=n(n-1) 条弧的有向图称作 有向完全图; 若边或弧的个数 e<nlogn,则称作 稀疏图,否则称(B) = 2
TD(B) = 3
设图G=(V,{VR})中的一个顶点序列 { u=vi,0,vi,1, …, vi,m=w}中,(vi,j-1,vi,j)VR 1≤j≤m, 则称从顶点u 到顶点w 之间存在一条路径。 路径上边的数目称作路径长度。 如:从A到F长度为 3 简单路径:指序列中顶 的路径{A,B,C,F} 点不重复出现的路径。 A 简单回路:指序列中 B E 第一个顶点和最后一