第7章 图
合集下载
运筹学课件:第7章 图论与网络分析-第1,2节

v1
v2 a
v3
v4 c
b v1
a
v2
b
v3
d
d
v4
c
第2节 最小树问题
一、树及其性质 定义1: 无圈的连通图称为树。树一般用T表示。
定理1: 任给树T=(V,E),若P(T)≥2,则 T中至少有两个悬挂点。
证明:设µ=(v1,v2,…,vk)是G中含边数最多的 一条初等链,因P(T)≥2,并且T是连通的, 故链µ中至少有一条边,从而v1与vk是不同的 。
不少数学家都尝试去解析这个事例。而这些解析,最 后发展成为了数学中的图论。
例:中国邮路问题 一个邮递员送信,要走完他所负责的全部街道分送
信件,最后返回邮局。邮递员都会本能地以尽可能少的 行程完成送信任务。
问题:他如何走?
点:路口; 边:两路口之间道路,第i条道路长ei。
问题:求一个圈,过每边至少一次,并使圈长度最短。
由于T是树,由定义知T连通且无圈。只须证明m=n-1。
归纳法: 当n=2时,由于T是树,所以两点间显然有且 仅有一条边,满足m=n-1。
假设 n=k-1时命题成立,即有k-1个顶点时,T有k-2条边。
当n=k时,因为T连通无圈,k个顶点中至少有一个点次 为1。设此点为u,即u为悬挂点,设连接点u的悬挂边 为[v,u],从T中去掉[v,u]边及点u ,不会影响T的连 通性,得图T’,T’为有k-1个顶点的树,所以T’有k-2条 边,再把( v,u)、点u加上去,可知当T有k个顶点 时有k-1条边。
4
2
v4
94
v2
3
v3 8
0 9 2 4 7 9 0 3 4 0 其权矩阵为: A 2 3 0 8 5 4 4 8 0 6 7 0 5 6 0
工程制图第7章 零件图

一组视图 完整尺寸
技术要求 标题栏
二、零件图的内容
1.视图 根据有关标准和规定,用正投影法表达零件内、外结 构的一组图形。
2.尺寸 零件图应正确、完整、清晰、合理地标注零件制造、 检验时所需的全部尺寸。
3.技术要求 标注或说明零件制造、检验或装配过程中应达到 的各项要求,如表面粗糙度、极限与配合、形状和位置公差、 热处理、表面处理等要求。
1.主视图的表达
1)形状特征的表达
能够清楚地表达主要形体的形状特征
2)加工位置的表达
反应了零件的加工位置
例如:(轴、盘类)
3)工作位置原则
反应了零件的工作位置
例如: (支架、壳体类)
2.其他视图的表达
首先读表达主要形体的其它视图,再读次要形体的视图。
二、典型零件图的视图的表达方法 1.轴、套类零件表达 ⑴ 分析形体、结构
4.标题栏 标题栏画在图框的右下角,需填写零件的名称、材 料、数量、比例,制图、审核人员的姓名、日期等内容。
§7-2 零件图的视图
一、视图表达的一般原则 1.主视图表达 2.其他视图的表达
二、典型零件图的视图的表达方法
轮盘类
支架
轴
传动装置
一、视图表达的一般原则
能正确、完整、清晰、合理地表达出零件的全部结构形状、读图 方便、画图简单。在画图前从零件的结构特点、使用功能和加工 方法等进行分析,选用了适当的视图和各种方法进行表达
基本符号上加一小圆,表示表面粗糙度是用不去除材料的 方法获得,如:铸,锻,冲压、热轧、冷轧、粉末冶金等; 或是用保持原供应状况的表面。
用任何方法获得的表面粗糙度,Ra 的上限值 3.2μ m。
用去除材料方法获得的表面粗糙度,Ra 的上 限值3.2μ m。
uml建模第七章 交互图

ref login
图7-13 ref操作符
7.1 顺序图——顺序图的深入
顺序图中使用其它的技术: 1、使用注释 2、使用约束 3、使用状态
7.1 顺序图——顺序图建模
1. 为每一个用例编写事件流,包括一个基本事件 流和若干可选事件流或异常流; 2. 识别事件流中参与交互的对象; 3. 为每个事件流绘制顺序图,包括为每个对象设 置生命线,即确定哪些对象存在于整个交互过 程中,哪些对象在交互过程中被创建和撤销; 4. 从引发这个交互过程的初始消息开始,在生命 线之间自顶向下依次画出随后的各个消息; 5. 如果需要,可以画上交互片段、交互引用和约 束等。
7.2 通信图
三、组成元素 1、对象
(2)主动对象(活动对象) 一组属性和一组方法的封装体,其中至少有一 个方法不需要接收消息就能主动执行(称作主 动方法)。
UML中
Rose中
7.2 通信图
三、组成元素 2、链
用来连接对象,消息显示在链的旁边,一个链 上可以有多个消息。 在顺序图中不使用链,只有协作图中才使用链 的概念。
图7-5 嵌套编号
Rose中的消息
7.1 顺序图——顺序图的深入
顺序图中,对象的行为有循环和分支两
种方式,为了表示这两种行为,引入了 交互片段、区域和操作符的概念。
7.1 顺序图——顺序图的深入
每个交互片段都有一个操作符,操作符
决定了交互片段的执行方式。
1、表示分支的操作符
alt:支持多条件
表7-2常用迭代表达式
迭代表达式 [i:=1..n] [I=1..10] [while(表达式)] [until(表达式)]
语义 迭代n次
I迭代10次 表达式为true时才进行迭代 迭代到表达识为true时,才停止迭代 在对象集合上迭代
图7-13 ref操作符
7.1 顺序图——顺序图的深入
顺序图中使用其它的技术: 1、使用注释 2、使用约束 3、使用状态
7.1 顺序图——顺序图建模
1. 为每一个用例编写事件流,包括一个基本事件 流和若干可选事件流或异常流; 2. 识别事件流中参与交互的对象; 3. 为每个事件流绘制顺序图,包括为每个对象设 置生命线,即确定哪些对象存在于整个交互过 程中,哪些对象在交互过程中被创建和撤销; 4. 从引发这个交互过程的初始消息开始,在生命 线之间自顶向下依次画出随后的各个消息; 5. 如果需要,可以画上交互片段、交互引用和约 束等。
7.2 通信图
三、组成元素 1、对象
(2)主动对象(活动对象) 一组属性和一组方法的封装体,其中至少有一 个方法不需要接收消息就能主动执行(称作主 动方法)。
UML中
Rose中
7.2 通信图
三、组成元素 2、链
用来连接对象,消息显示在链的旁边,一个链 上可以有多个消息。 在顺序图中不使用链,只有协作图中才使用链 的概念。
图7-5 嵌套编号
Rose中的消息
7.1 顺序图——顺序图的深入
顺序图中,对象的行为有循环和分支两
种方式,为了表示这两种行为,引入了 交互片段、区域和操作符的概念。
7.1 顺序图——顺序图的深入
每个交互片段都有一个操作符,操作符
决定了交互片段的执行方式。
1、表示分支的操作符
alt:支持多条件
表7-2常用迭代表达式
迭代表达式 [i:=1..n] [I=1..10] [while(表达式)] [until(表达式)]
语义 迭代n次
I迭代10次 表达式为true时才进行迭代 迭代到表达识为true时,才停止迭代 在对象集合上迭代
第7章 图论 [离散数学离散数学(第四版)清华出版社]
![第7章 图论 [离散数学离散数学(第四版)清华出版社]](https://img.taocdn.com/s3/m/58b7923143323968011c9244.png)
6/27/2013 6:02 PM
第四部分:图论(授课教师:向胜军)
21
例:
a j i h c g d
1(a)
无 向 图
b
f
e
2(b)
7(j) 8(g) 9(d) 10(i)
6(e)
3(c) 4(h)
5(f)
6/27/2013 6:02 PM
第四部分:图论(授课教师:向胜军)
22
例:
1(b)
有向图
第四部分:图论(授课教师:向胜军)
6
[定义] 相邻和关联
在无向图G中,若e=(a, b)∈E,则称a与 b彼此相邻(adjacent),或边e关联 (incident) 或联结(connect) a, b。a, b称为边e的端点或 结束顶点(endpoint)。 在有向图D中,若e=<a, b>∈E,即箭头 由a到b,称a邻接到b,或a关联或联结b。a 称为e的始点(initial vertex),b称为e的终点 (terminal/end vertex)。
证明思路:将图中顶点的度分类,再利用定理1。
6/27/2013 6:02 PM 第四部分:图论(授课教师:向胜军) 9
[定理3] 设有向图D=<V, E>有n个顶点,m 条边,则G中所有顶点的入度之和等于所 有顶点的出度之和,也等于m。
即:
d ( v i ) d ( v i ) m.
i 1 i 1
n
n
证明思路:利用数学归纳法。
6/27/2013 6:02 PM
第四部分:图论(授课教师:向胜军)
10
一些特殊的简单图:
(1) 无向完全图Kn(Complete Graphs)
[UNL课件] 第7章 序列图
![[UNL课件] 第7章 序列图](https://img.taocdn.com/s3/m/0ce430c949649b6648d7477e.png)
– 强调消息的时间顺序的交互图。
• 协作图(ration diagram)
– 强调发送和接收消息的对象的机构组织的交互图。
7.1 序列图的基本概念
– 序列图的用途
• 确认和丰富语境的逻辑表达; • 细化用例的表达;
• 描述类所分配职责及分配原因。
: SearchBookWindow : Borrower 1: 查找图书 2: 根据条件查找图书 3: 返回图书信息 4: 显示图书信息 : Book
• 示例1:使用序列图描述网络通信的过程。
– 过程描述如下:
• 发送者和接收者是通信双方。 • 发送者通过发送一个启动事务的包来与接收者建立 连接。接收者成功的读取此包,并回复确认信息。 • 发送者收到确认信息后,会传输一个文件开始的包 ,这个包也被接收者确认。 • 完成3次确认后,文件数据进行传输。 • 传输完成后通信结束。
• 销毁一个对象并回收占用资源。对象可以销毁自己。 • 销毁对象时,在其生命线上画“ X ”。
7.3 序列图的高级概念
• 2、顺序图中的结构化控制
– 序列型消息
条件、 循环、并发
– 使用控制操作符进行结构化控制。
7.3 序列图的高级概念
– 1)可选
• 标签:opt • 说明:
– 如果进入操作符的时候监护条件成立,那么该控制操 作符的主体就会得到执行。
2: 创建取款界面 ( ) 3: 显示取款界面 ( )
: 用户
1: 选择取款事务 ( )
4: 输入取款金额 ( ) 5: 账户余额校验 ( ) 6: 查询账户余额 ( ) 7: 返回账户余额 8: 修改账户余额 ( ) 9: 返回结果:取款成功 10: 提示取走现金,询问下一步业务 ( )
• 协作图(ration diagram)
– 强调发送和接收消息的对象的机构组织的交互图。
7.1 序列图的基本概念
– 序列图的用途
• 确认和丰富语境的逻辑表达; • 细化用例的表达;
• 描述类所分配职责及分配原因。
: SearchBookWindow : Borrower 1: 查找图书 2: 根据条件查找图书 3: 返回图书信息 4: 显示图书信息 : Book
• 示例1:使用序列图描述网络通信的过程。
– 过程描述如下:
• 发送者和接收者是通信双方。 • 发送者通过发送一个启动事务的包来与接收者建立 连接。接收者成功的读取此包,并回复确认信息。 • 发送者收到确认信息后,会传输一个文件开始的包 ,这个包也被接收者确认。 • 完成3次确认后,文件数据进行传输。 • 传输完成后通信结束。
• 销毁一个对象并回收占用资源。对象可以销毁自己。 • 销毁对象时,在其生命线上画“ X ”。
7.3 序列图的高级概念
• 2、顺序图中的结构化控制
– 序列型消息
条件、 循环、并发
– 使用控制操作符进行结构化控制。
7.3 序列图的高级概念
– 1)可选
• 标签:opt • 说明:
– 如果进入操作符的时候监护条件成立,那么该控制操 作符的主体就会得到执行。
2: 创建取款界面 ( ) 3: 显示取款界面 ( )
: 用户
1: 选择取款事务 ( )
4: 输入取款金额 ( ) 5: 账户余额校验 ( ) 6: 查询账户余额 ( ) 7: 返回账户余额 8: 修改账户余额 ( ) 9: 返回结果:取款成功 10: 提示取走现金,询问下一步业务 ( )
机械制图第7章(标准件与常用件)

上一页 下一页 返回
7.1 螺纹
2.管螺纹 在水管、油管、煤气管的管道连接中常用管螺纹,它们是 英寸制的。有非螺纹密封的内、外管螺纹和用螺纹密封的圆 柱内管螺纹;还有用螺纹密封的圆锥内、外管螺纹。前者代号 分别为G和 R p ;后者代号为 RC 和R( R1 和 R2 ,其中 R1 表示 与圆柱内螺纹相配合的圆锥外螺纹, R2 表示与圆锥内螺纹相 配合的圆锥外螺纹)。管螺纹应标注螺纹特征代号和尺寸代号; 非螺纹密封的外管螺纹还应标注公差等级;当螺纹为左旋时, 应在最后加注"LH",并用“-”隔开。尺寸代号与带有外螺 纹管子的孔径相近,而不是管螺纹的大径。非螺纹密封的管 螺纹的大径、小径和螺距。
上一页 下一页 返回
7.2常用螺纹紧固件
7.2.2 双头螺柱连接
双头螺柱连接由双头螺柱、螺母和垫圈组成。在两个被连接 的零件中,其中有一个较厚或不适宜用螺栓连接时,常采用 双头螺柱连接。事先在较薄的连接零件上钻有比螺栓大径略 大的通孔(=1. 1d),在较厚的连接零件上加工出内螺纹孔。 已知双头螺柱的形式、公称直径、被联接件的厚度以及旋入 端的材料,由此估算螺柱的长度L„。 L„=较薄零件的厚度( )+垫圈厚度(0. 15d)+螺母厚度(0. 8d) +a 式中:a = (0. 3 -0. 4)d,是螺柱顶端露出螺母的长度。根 据此式算出的参考长度L'。
上一页
返回
7.2常用螺纹紧固件
螺纹紧固件就是运用一对内、外螺纹的连接作用来连接和紧 固一些零部件。常用的螺纹紧固件有螺钉、螺栓、螺柱(亦称 双头螺柱)、螺母和垫圈等。螺纹紧固件的结构、尺寸均已标 准化,并由有关专业工厂大量生产。根据螺纹紧固件的规定 标记,就能在相应的标准中查出有关的尺寸。因此,对符合 标准的螺纹紧固件,不需再详细画出它们的零件图。表7-2 列出了图7-12所示的常用螺纹紧固件的视图、主要尺寸及 规定标记示例。
第7章 协作图

使用Rose创建协作图
3. 创建链
在协作图中创建链的操作与在对象图中创建链的操作相同,可以 按照在对象图中创建链的方式进行创建。同样我们也可以在链的 规范对话框的“General”选项卡中设置链的名称、关联、角色 以及可见性等。 链的可见性是指一个对象是否能够对另一个对象可见的机制。
在项目中创建协作图案例分析
什么是协作图
2. 为什么要使用协作图
协作图作为一种在给定语境中描述协作中各个对象之间的组织交互关系 的空间组织结构图形化方式,在使用其进行建模时,可以将其作用分为 以下三个方面:
通过描绘对象之间消息的传递情况来反映具体的使用语境的逻辑表达。一个 使用情境的逻辑可能是一个用例的一部分,或是一条控制流。这和序列图的 作用类似。
时序图与协作图的互换
①
②
时序图与协作图都表示对象之间的交互 作用,只是它们的侧重点有所不同: 时序图描述了交互过程中的时间顺序, 但没有明确地表达对象之间的关系。 协作图描述了对象之间的关系,但时间 顺序必须从顺序号获得。 两种图的语义是等价的,可以从一种形 式的图转换成另一种形式的图,而不丢 失任何信息。
组成协作图的元素
3. 链
在协作图中的链和对象图中链的概念和表示形式都相同,都是两个或多 个对象之间的独立连接,是对象引用元组(有序表),是关联的实例。
在协作图中,链的表示形式为一个或多个相连的线或弧。在自身相关联 的类中,链是两端指向同一对象的回路,是一条弧。为了说明对象是如 何与另外一个对象进行连接的,我们还可以在链的两端添加上提供者和 客户端的可见性修饰。如下图所示,是链的普通和自身关联的表示形式。
消息
离散数学第七章图的基本概念

4.无向图的连通性
若无向图G中任何两顶点都连通,则称G是连通图.
对于任意的无向图G.设V1,V2,…,Vk是顶点之间连通关系的 等价类,则称他们的导出子图为G的连通分支.用p(G)表示G 的连通分支数.
V1 e1
e2 e3
V3
e4 V2
V4
a
de
h
i
b
c
f
g
5.有向图的连通性
若略去有向图D中各边的键头,所得无向图是无向连通图,则 称D是弱连通图(或称D是连通图).
(2) mij d (vi )(i 1,2,..., n)
j 1
mn
nm
n
(3) mij mij d(vi ) 2m
j1 i1
i1 j1
i 1
m
(4) mij 0 vi是孤立点 j 1
(5)若第j列与第k列相同, 则说明e j与ek为平行边.
2.有向图的关联矩阵
设有向图D=<V,E>,V={v1,v2,…,vn},E={e1,e2,…,em} 1, vi为ej的始点
e1,e2,e3},{e1,e2,
e2
e4},{e9}等边割集 ,e9是桥.
e3 V4
e5 e6
V5 e4
V6
e9
V7
7.3 图的矩阵表示
1.无向图的关联矩阵
设无向图G=<V,E>,V={v1,v2,…,vn},E={e1,e2,…,em}
令mij为顶点vi与ej的关联次数, 则称(mij)n×m为G的关联矩阵.记为M(G)
若Γ 满足:vi-1,vi为ei的端点(若G为有向图,vi-1是ei的始 点,vi是ei的终点)i=1,2,…,k,则称Γ 为G中通路,v0,vk分 别称为通路的始点和终点,Γ 中边的数目k称为通路长度.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示
三、有向图的十字链表存储表示
一、图的数组(邻接矩阵)存储表示
定义:矩阵的元素为
Aij=
V1 V3
V4 V5 无向图 G2
{ 1 (i,j)VR
V1 V2 V3 V4 V5 V1 V2 V3 V4 V5
0 (i,j)VR
V2
0 1 0 1 0
插入或删除顶点
插入和删除弧
对邻接点的操作
遍历
结构的建立和销毁
CreatGraph(&G, V, VR):
// 按定义(V, VR) 构造图 DestroyGraph(&G):
// 销毁图
对顶点的访问操作
LocateVex(G, u); // 若G中存在顶点u,则返回该顶点在 // 图中“位置” ;否则返回其它信息。 GetVex(G, v); // 返回 v 的值。
4 4 5 5 1 2
A 5
3
弧的结点结构
adjvex nextarc info
typedef struct ArcNode { int adjvex; // 该弧所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 InfoType *info; // 该弧相关信息的指针 } ArcNode;
遍 历
DFSTraverse(G, v, Visit());
//从顶点v起深度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
BFSTraverse(G, v, Visit());
//从顶点v起广度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
7.2 图的存储表示
二、邻接表:图的链式存储结构
每个顶点建立一个单链表,第i个单链表中的结 点表示依附于顶点vi的边(对有向图是以顶点vi 为尾的弧) 表头结点通常以顺序结构的形式存储,以便访问 任一顶点的链表。
二、邻接表:图的链式存储结构
B C D F E
0 1 2 3 4 5
A B C D E F
1 0 3 2 0 1
第七章 图
7.1 抽象数据类型图的定义
7.2 图的存储表示
7.3 图的遍历
7.4 最小生成树 7.5 拓扑排序 7.6 关键路径 7.7 两点之间的最短路径问题
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成
的数据结构。 Graph = (V , R ) 其中,VR={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为 弧尾,w 为弧头。 谓词 P(v,w) 定义了弧 <v,w>的意义或信息。
对非连通图,则 称由各个连通分 量的生成树的集 合为此非连通图 的生成森林。
数据结构
第七章 图
一棵有n个顶点的生成树有且仅有n-1条边。若一个 图有n个顶点和小于n-1条边,则是非连通图。若它多 于n-1条边,则一定有环。但是有n-1条边的图不一定是 生成树。
A B A B A B
C
F I L
D
G J G3
11
弧或边带权的图
B
3
7
E
C
F
分别称作有向网或 无向网。
设图G=(V,{VR}) 和 图 G=(V,{VR}), 且 VV, VRVR, 则称 G 为 G 的子图。
B
A
B E
C
F
假设图中有 n 个顶点,e 条边,则
含有 e=n(n-1)/2 条边的无向图称作 完全图; 含有 e=n(n-1) 条弧的有向图称作 有向完全图; 若边或弧的个数 e<nlogn,则称作 稀疏图,否则称作稠密图。
C
F
C
F
数据结构
第七章 图
例:
A
C F I L G3 D G J E H K M L
B
A C F J
B
D G I
E H K
M
数据结构
第七章 图
例:
V1 V3
V2 V4
V1 V3 V4
V2
有向图G1
G1的两个强连通分量
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小 连通子图,称该极小连通子图为此连通图 的生成树。 B A F E C D
case UDG: return CreateUDG(G); //构造无向图G
case UDN: return CreateUDN(G); //构造无向网G default: return ERROR; } }//CreateGraph
Status CreateUDN (MGraph &G){ //采用数组(邻接矩阵)表示法,构造无向网G。 scanf(&G.vexnum,&G.arcnum,&IncInfo);//IncInfo为0则 各弧不含其他信息 for(i=0;i<G.vexnum;++i) scanf(&G.vexs[i]);//构造顶点向 量 for(i=0;i<G.vexnum;++i) //初始化邻接矩阵 for(j=0;j<G.vexnum;++j) G.arcs[i][j]={INFINITY,NULL};//{adj,info}初始值为∞和 null for(k=0;k<G.arcnum;++k){//构造邻接矩阵 …… } return OK; }//CreateGraph
G2.arcs= V5
V4
无向图G2
G2的邻接矩阵
对于无向图:顶点vi的度是邻接矩阵中第
i行(或第i列)的元素之和 TD(vi)= A[i][j]
i 0 n 1
(n=MAX_VERTEX_NUM) 对于有向图:第i行的元素之和为顶点vi
的出度OD(vi),
第j列的元素之和为顶点vi的入度ID( vi )
// 点”。若 w 是 v 的最后一个邻接点,则 // 返回“空”。
插入或删除顶点
InsertVex(&G, v);
//在图G中增添新顶点v。
DeleteVex(&G, v);
// 删除G中顶点v及其相关的弧。
插入和删除弧
InsertArc(&G, v, w); // 在G中增添弧<v,w>,若G是无向的, //则还增添对称弧<w,v>。 DeleteArc(&G, v, w); //在G中删除弧<v,w>,若G是无向的, //则还删入度为0,其余顶 点的入度均为1,则是一棵有向树。一个有向图的生成 森林由若干棵有向树组成,含有图中全部顶点,但只 有足以构成若干棵不相交的有向树的弧。
A F B E 有向图 C D
A
F A F E
B
E
C
D C
强连通分量
B 生成森林
D
基本操作
结构的建立和销毁 对顶点的访问操作
例如: OD(B) = 1 ID(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 之间存在一条路径。 路径上边的数目称作路径长度。 如:长度为3的路径 简单路径:序列中顶点 {A,B,C,F} 不重复出现的路径。 A 简单回路:序列中第一 B E 个顶点和最后一个顶 点相同的路径。 C F
(B,E), (C,D), (D,F), (B,F), (C,F) }
由顶点集和边 集构成的图称 作无向图。
B
C
A F E
D
名词和术语
网、子图
完全图、稀疏图、稠密图
邻接点、度、入度、出度 路径、路径长度、简单路径、简单回路
连通图、连通分量、 强连通图、强连通分量 生成树、生成森林
15
A
21 2
9
7 ∞ ∞ ∞ 5 ∞
∞ ∞ ∞ ∞ ∞ 1
∞ ∞ 9 6 ∞ ∞
网N的邻接矩阵
在邻接矩阵存储结构MGraph上构造图: Status CreateGraph(MGraph &G){
算法7.1
//采用数组(邻接矩阵)表示法,构造图G。
scanf(&G.kind); switch(G.kind){ case DG: return CreateDG(G); //构造有向图G case DN: return CreateDN(G); //构造有向网G
若图G中任意两个顶 点之间都有路径相通, 则称此图为连通图; A B A
F E
B
C D
C
D
F
E
若无向图为非连通图, 则图中各个极大连通 子图称作此图的连通 分量。
若任意两个顶点之间都存在 对有向图, 一条有向路径,则称此有向图为强连通图。 否则,其各个强连通子图称作它的 强连通分量。 A B E B A E
PutVex(&G, v, value); // 对 v 赋值value。
对邻接点的操作
FirstAdjVex(G, v);
// 返回 v 的“第一个邻接点” 。若该顶点 //在 G 中没有邻接点,则返回“空”。
NextAdjVex(G, v, w); // 返回 v 的(相对于 w 的) “下一个邻接
for(k=0;k<G.arcnum;++k){//构造邻接矩阵 scanf(&v1,&v2,&w);//依次输入一条边依附的顶点和权值 i=LocateVex(G,v1); j=LocateVex(G,v2);//确定v1和v2在G中的位置 G.arcs[i][j].adj=w;//弧<v1,v2>的权值 if(IncInfo) Input(*G.arcs[i][j].info); //若弧含有相关信息,则输入 G.arcs[j][i]=G.arcs[i][j]; //置<v1,v2>的对称弧<v2,v1>}
三、有向图的十字链表存储表示
一、图的数组(邻接矩阵)存储表示
定义:矩阵的元素为
Aij=
V1 V3
V4 V5 无向图 G2
{ 1 (i,j)VR
V1 V2 V3 V4 V5 V1 V2 V3 V4 V5
0 (i,j)VR
V2
0 1 0 1 0
插入或删除顶点
插入和删除弧
对邻接点的操作
遍历
结构的建立和销毁
CreatGraph(&G, V, VR):
// 按定义(V, VR) 构造图 DestroyGraph(&G):
// 销毁图
对顶点的访问操作
LocateVex(G, u); // 若G中存在顶点u,则返回该顶点在 // 图中“位置” ;否则返回其它信息。 GetVex(G, v); // 返回 v 的值。
4 4 5 5 1 2
A 5
3
弧的结点结构
adjvex nextarc info
typedef struct ArcNode { int adjvex; // 该弧所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 InfoType *info; // 该弧相关信息的指针 } ArcNode;
遍 历
DFSTraverse(G, v, Visit());
//从顶点v起深度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
BFSTraverse(G, v, Visit());
//从顶点v起广度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
7.2 图的存储表示
二、邻接表:图的链式存储结构
每个顶点建立一个单链表,第i个单链表中的结 点表示依附于顶点vi的边(对有向图是以顶点vi 为尾的弧) 表头结点通常以顺序结构的形式存储,以便访问 任一顶点的链表。
二、邻接表:图的链式存储结构
B C D F E
0 1 2 3 4 5
A B C D E F
1 0 3 2 0 1
第七章 图
7.1 抽象数据类型图的定义
7.2 图的存储表示
7.3 图的遍历
7.4 最小生成树 7.5 拓扑排序 7.6 关键路径 7.7 两点之间的最短路径问题
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成
的数据结构。 Graph = (V , R ) 其中,VR={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为 弧尾,w 为弧头。 谓词 P(v,w) 定义了弧 <v,w>的意义或信息。
对非连通图,则 称由各个连通分 量的生成树的集 合为此非连通图 的生成森林。
数据结构
第七章 图
一棵有n个顶点的生成树有且仅有n-1条边。若一个 图有n个顶点和小于n-1条边,则是非连通图。若它多 于n-1条边,则一定有环。但是有n-1条边的图不一定是 生成树。
A B A B A B
C
F I L
D
G J G3
11
弧或边带权的图
B
3
7
E
C
F
分别称作有向网或 无向网。
设图G=(V,{VR}) 和 图 G=(V,{VR}), 且 VV, VRVR, 则称 G 为 G 的子图。
B
A
B E
C
F
假设图中有 n 个顶点,e 条边,则
含有 e=n(n-1)/2 条边的无向图称作 完全图; 含有 e=n(n-1) 条弧的有向图称作 有向完全图; 若边或弧的个数 e<nlogn,则称作 稀疏图,否则称作稠密图。
C
F
C
F
数据结构
第七章 图
例:
A
C F I L G3 D G J E H K M L
B
A C F J
B
D G I
E H K
M
数据结构
第七章 图
例:
V1 V3
V2 V4
V1 V3 V4
V2
有向图G1
G1的两个强连通分量
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小 连通子图,称该极小连通子图为此连通图 的生成树。 B A F E C D
case UDG: return CreateUDG(G); //构造无向图G
case UDN: return CreateUDN(G); //构造无向网G default: return ERROR; } }//CreateGraph
Status CreateUDN (MGraph &G){ //采用数组(邻接矩阵)表示法,构造无向网G。 scanf(&G.vexnum,&G.arcnum,&IncInfo);//IncInfo为0则 各弧不含其他信息 for(i=0;i<G.vexnum;++i) scanf(&G.vexs[i]);//构造顶点向 量 for(i=0;i<G.vexnum;++i) //初始化邻接矩阵 for(j=0;j<G.vexnum;++j) G.arcs[i][j]={INFINITY,NULL};//{adj,info}初始值为∞和 null for(k=0;k<G.arcnum;++k){//构造邻接矩阵 …… } return OK; }//CreateGraph
G2.arcs= V5
V4
无向图G2
G2的邻接矩阵
对于无向图:顶点vi的度是邻接矩阵中第
i行(或第i列)的元素之和 TD(vi)= A[i][j]
i 0 n 1
(n=MAX_VERTEX_NUM) 对于有向图:第i行的元素之和为顶点vi
的出度OD(vi),
第j列的元素之和为顶点vi的入度ID( vi )
// 点”。若 w 是 v 的最后一个邻接点,则 // 返回“空”。
插入或删除顶点
InsertVex(&G, v);
//在图G中增添新顶点v。
DeleteVex(&G, v);
// 删除G中顶点v及其相关的弧。
插入和删除弧
InsertArc(&G, v, w); // 在G中增添弧<v,w>,若G是无向的, //则还增添对称弧<w,v>。 DeleteArc(&G, v, w); //在G中删除弧<v,w>,若G是无向的, //则还删入度为0,其余顶 点的入度均为1,则是一棵有向树。一个有向图的生成 森林由若干棵有向树组成,含有图中全部顶点,但只 有足以构成若干棵不相交的有向树的弧。
A F B E 有向图 C D
A
F A F E
B
E
C
D C
强连通分量
B 生成森林
D
基本操作
结构的建立和销毁 对顶点的访问操作
例如: OD(B) = 1 ID(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 之间存在一条路径。 路径上边的数目称作路径长度。 如:长度为3的路径 简单路径:序列中顶点 {A,B,C,F} 不重复出现的路径。 A 简单回路:序列中第一 B E 个顶点和最后一个顶 点相同的路径。 C F
(B,E), (C,D), (D,F), (B,F), (C,F) }
由顶点集和边 集构成的图称 作无向图。
B
C
A F E
D
名词和术语
网、子图
完全图、稀疏图、稠密图
邻接点、度、入度、出度 路径、路径长度、简单路径、简单回路
连通图、连通分量、 强连通图、强连通分量 生成树、生成森林
15
A
21 2
9
7 ∞ ∞ ∞ 5 ∞
∞ ∞ ∞ ∞ ∞ 1
∞ ∞ 9 6 ∞ ∞
网N的邻接矩阵
在邻接矩阵存储结构MGraph上构造图: Status CreateGraph(MGraph &G){
算法7.1
//采用数组(邻接矩阵)表示法,构造图G。
scanf(&G.kind); switch(G.kind){ case DG: return CreateDG(G); //构造有向图G case DN: return CreateDN(G); //构造有向网G
若图G中任意两个顶 点之间都有路径相通, 则称此图为连通图; A B A
F E
B
C D
C
D
F
E
若无向图为非连通图, 则图中各个极大连通 子图称作此图的连通 分量。
若任意两个顶点之间都存在 对有向图, 一条有向路径,则称此有向图为强连通图。 否则,其各个强连通子图称作它的 强连通分量。 A B E B A E
PutVex(&G, v, value); // 对 v 赋值value。
对邻接点的操作
FirstAdjVex(G, v);
// 返回 v 的“第一个邻接点” 。若该顶点 //在 G 中没有邻接点,则返回“空”。
NextAdjVex(G, v, w); // 返回 v 的(相对于 w 的) “下一个邻接
for(k=0;k<G.arcnum;++k){//构造邻接矩阵 scanf(&v1,&v2,&w);//依次输入一条边依附的顶点和权值 i=LocateVex(G,v1); j=LocateVex(G,v2);//确定v1和v2在G中的位置 G.arcs[i][j].adj=w;//弧<v1,v2>的权值 if(IncInfo) Input(*G.arcs[i][j].info); //若弧含有相关信息,则输入 G.arcs[j][i]=G.arcs[i][j]; //置<v1,v2>的对称弧<v2,v1>}