中山大学数据结构第07章图第4讲PPT课件
合集下载
数据结构第七章图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)弧头和弧尾:有序偶对的第一个结点称为始点(或弧尾,即不带箭 头的一端),有序偶对的第二个结点称为终点(或弧头,即带箭头的一 端)。
数据结构《第七章、图》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 相关联。
数据结构第7章_图_7.4~7.6

数据结构(C语言)
7.4 最小生成树
三、Prime算法——让一颗小树长大
算法实现具体示例
1
6 2 3 5
1 2 3 4 5 6
1
5 6 6 3 5
5 4
closedge vex lowcost vex lowcost vex lowcost
v 2 1 6
3 5
3
4
5
6
U {1}
{1, 3} {1,3,6} {1,3,6, 4}
4 100 100 90 60
30 10 60 3
4
{0} {0,1} {0,1,3} {0,1,2,3}
10
2
20
最短路径 {0,1}
{0,3,2}
{0,3}
{0,3,2,4}
数据结构(C语言)
本章小结
最短路径
Dijkstra算法 Floyd算法 邻接矩阵 邻 接 表 十字链表 邻接多重表 深度优先搜索DFS
8
4
1
4 5
1
5
5
在生成树中任加一条 边都一定构成回路
数据结构(C语言)
7.4 最小生成树
二、贪心算法
什么是“贪”:每一步都是最好的 什么是“好”:权值最小的边 需要约束: 只能用图里边有的边 只能正好用掉n-1条边 不能有回路
6
4
10 8
1
4 5
1
5
数据结构(C语言)
7.4 最小生成树
7.4 最小生成树
提问问题:
给出各个城市间铺设煤气管道的成本,要求在保证煤气能输送到各个城市的前 提下,达到铺设成本最小。
课件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
数据结构 (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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C1
高等数学
C2
程序设计基础
C3
离散数学
C1, C2
C4
数据结构
C3, C2
C5
高级语言程序设计
C2
C6
编译方法
C5, C4
C7
操作系统
C4, C9
C8
普通物理
C1
C9
计算机原理
C8
学生课程学习工程图
可以用有向图表示一个工程。在这种有向图中, 用顶点表示活动,用有向边<Vi, Vj>表示活动。Vi 必须先于活动Vj 进行。这种有向图叫做顶点表示 活动的AOV网络(Activity On Vertices)。
Edge<int> * p = new Edge<int>(k);
//建立边结点, dest 域赋为 k
p→link = NodeTable[j].adj;
NodeTable[j].adj = p;
//链入顶点 j 的边链表的前端
count[k]++;
//顶点 k 入度加一
在拓扑排序算法中,使用一个存放入度为零的 顶点的链式栈,供选择和输出无前驱的顶点。 只要出现入度为零的顶点,就将它加入栈中。 使用这种栈的拓扑排序算法可以描述如下: (1) 建立入度为零的顶点栈; (2) 当入度为零的顶点栈不空时, 重复执行
AOV网络及其邻接表表示
count data adj dest link
0
2 0 C2
1
3 1 C3 0
4 0 C4
0
5 3 C5 0
C0
30 50 1
C1
50
C2
C3
C4
C5
在邻接表中增设了一个数组count[ ],记录各个 顶点入度。入度为零的顶点即无前驱的顶点。
在输入数据前,邻接表的顶点表NodeTable[ ]和 入度数组count[ ]全部初始化。在输入数据时, 每输入一条边<j, k>,就需要建立一个边结点, 并将它链入相应边链表中,统计入度信息:
NodeTable = new vertex<int, float>[n];
count = new int[n];
};
void TopologicalOrder ( );
C0
C1
C2
C3
C4
C5
(b) 输出顶点C4
C1
C2
C3
C5 C3
C5
(c) 输出顶点C0
(d) 输出顶点C3
C1
C2
C1
C5
(e) 输出顶点C2
C5
(f) 输出顶点C1
C5
(g) 输出顶点C5
(h) 拓扑排序完成
最后得到的拓扑有序序列为 C4 , C0 , C3 , C2 , C1 , C5 。它满足图中给出的所有前驱和后继关系, 对于本来没有这种关系的顶点,如C4和C2,也排 出了先后次序关系。
第7
活动网络
活动网络 (Activity Network)
用顶点表示活动的网络 (AOV网络)
计划、施工过程、生产流程、程序流程等都是 “工程”。除了很小的工程外,一般都把工程 分为若干个叫做“活动”的子工程。完成了这 些活动,这个工程就可以完成了。
例如,计算机专业学生的学习就是一个工程, 每一门课程的学习就是整个工程的一些活动。 其中有些课程要求先修课程,有些则不要求。 这样在有的课程之间有领先关系,有的课程可 以并行地学习。
这种构造AOV网络全部顶点的拓扑有序序列的 运算就叫做拓扑排序。
如果通过拓扑排序能将AOV网络的所有顶点都 排入一个拓扑有序的序列中,则该AOV网络中 必定不会出现有向环;相反,如果得不到满足 要求的拓扑有序序列,则说明AOV网络中存在 有向环,此AOV网络所代表的工程是不可行的。
例如,对学生选课工程图进行拓扑排序,得到 的拓扑有序序列为
C1 , C2 , C3 , C4 , C5 , C6 , C8 , C9 , C7 或 C1 , C8 , C9 , C2 , C5 , C3 , C4 , C7 , C6
进行拓扑排序的方法
输入AOV网络。令 n 为顶点个数。 在AOV网络中选一个没有直接前驱的顶点, 并输出之; 从图中删去该顶点, 同时删去所有它发出的有 向边;
将顶点 I 进栈时,执行以下指针的修改:
count[i] = top; top = i;
// top指向新栈顶i, 原栈顶元素放在count[i]中
退栈操作可以写成:
j = top; top = count[top];
//位于栈顶的顶点的位置记于 j, top退到次栈顶
拓扑排序时入度为零的 顶点栈的变化
class Graph {
//图的邻接表的类定义
friend class <int, float>Vertex;
friend class <float>Edge;
private:
Vertex<int, float> *NodeTable;
int *count;
int n;
public:
Graph ( const int vertices = 0 ) : n ( vertices ) {
在AOV网络中,如果活动Vi 必须在活动Vj 之前 进行,则存在有向边<Vi, Vj>, AOV网络中不能 出现有向回路,即有向环。在AOV网络中如果 出现了有向环,则意味着某项活动应以自己作为 先决条件。
因此,对给定的AOV网络,必须先判断它是否 存在有向环。
检测有向环的一种方法是对AOV网络构造它的 拓扑有序序列。即将各个顶点 (代表各个活动) 排列成一个线性有序的序列,使得AOV网络中 所有应存在的前驱和后继关系都能得到满足。
重复以上 、 步, 直到
全部顶点均已输出,拓扑有序序列形成,拓扑 排序完成;或 图中还有未输出的顶点,但已跳出处理循环。 这说明图中还剩下一些顶点,它们都有直接前 驱,再也找不到没有前驱的顶点了。这时AOV 网络中必定存在有向环。
拓扑排序的过程
C0
C1
C2 C0
C1
C2
C3
C4
C5
(a) 有向无环图
从顶点栈中退出一个顶点, 并输出之; 从AOV网络中删去这个顶点和它发出的边, 边的终顶点入度减一; 如果边的终顶点入度减至0, 则该顶点进入 度为零的顶点栈; (3) 如果输出顶点个数少于AOV网络的顶点个 数, 则报告网络中存在有向环。
在算法实现时,为了建立入度为零的顶点栈, 可以不另外分配存储空间,直接利用入度为零 的顶点的count[ ]数组元素。我们设立了一个栈 顶指针top,指示当前栈顶的位置,即某一个入 度为零的顶点位置。栈初始化时置top = -1,表 示空栈。