第14讲 图的生成树汇总

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》
Data Structure
普里姆(Prim)算法
34 B 12
A 19
26 E
F
46 25
25 38
C
D
17
U={A, F, C}
V-U={B, D, E}
cost={(A, B)34, (C, D)17, (F, E)26}
《数据结构》
Data Structure
普里姆(Prim)算法
25 38
C
D
17
C
D
17
连通分量={A}, {B, E}, {C, D}, {F}
连通分量={A, F}, {B, E}, {C, D}
《数据结构》
Data Structure
克鲁斯卡尔(Kruskal)算法
34 B 12
B 12
A 19
26 E A 19
E
F
F
46 25
25 38
25
C
D
17
C
B 12
A 19
26 E A
E
F
F
46 25
25 38
C
D
17
C
D
连通分量={A}, {B}, {C}, {D}, {E}, {F}
连通分量={A}, {B, E}, {C}, {D}, {F}
《数据结构》
Data Structure
克鲁斯卡尔(Kruskal)算法
34 B 12
B 12
A 19
26 E A
{A, F, C, D, E}
{B}
(E B)12
adjvex lowcost
{A,F,C,D,E, B}
{}
《数据结构》
Data Structure
普里姆(Prim)算法
Prim算法——伪代码
1. 初始化两个辅助数组lowcost和adjvex;
2. 输出顶点u0,将顶点u0加入集合U中; 3. 重复执行下列操作n-1次
关键:是如何找到连接U和V-U的最短边。
利用MST性质,可以用下述方法构造候选最短边集: 对应V-U中的每个顶点,保留从该顶点到U中的各顶 点的最短边。
《数据结构》
Data Structure
普里姆(Prim)算法
34 B 12
A 19
26 E
F
46 25
25 38
C
D
17
U={A}
V-U={B, C, D, E, F}
34 B 12
A 19
26 E
F
46 25
25 38
C
D
17
U={A, F, C, D} V-U={B, E} cost={(A, B)34, (F, E)26}
《数据结构》
Data Structure
普里姆(Prim)算法
34 B 12
A 19
26 E
F
46 25
25 38
C
D
17
U={A, F, C, D, E} V-U={B} cost={(E, B)12}
(A F)19
F}
{B, C, D, E} (F C)25
adjvex A lowcost 34
C
F
17 26
{A, F, C} {B, D, E} (C D)17
adjvex A lowcost 34
F
{A, F, C, D} {B, E} (F E)26
26
adjvex E lowcost 12
主要内容
Data Structure
1. 图的连通性 2. Prim算法 3. Kruskal算法
《数据结构》
Data Structure
普里姆(Prim)算法
基本思想:设G=(V, E)是具有n个顶点的连通网, T=(U, TE) 是 G 的 最小 生 成树 , T 的初 始 状态 为 U={u0}(u0∈V),TE={ },重复执行下述操作: 在所有u∈U,v∈V-U的边中找一条代价最小的边 (u, v)并入集合TE,同时v并入U,直至U=V。
⑶ 每一次逆向深度优先遍历所访问到的顶点集便是 该有向图的一个强连通分量的顶点集。
《数据结构》
图的生成树
Data Structure
V1
V2
V3
V1
V2
V3
V4
V5 V6
V7
V4
V5 V6
V7
V8
(a)深度优先生成树
V8
(b) 广度优先生成树
《数据结构》
图的生成树
Data Structure
结论:
Data Structure
⑴ 从某顶点出发进行深度优先遍历,并按其所有邻 接点都访问(即出栈)的顺序将顶点排列起来。
⑵ 从最后完成访问的顶点出发,沿着以该顶点为头 的弧作逆向的深度优先遍历。若不能访问到所有顶 点,则从余下的顶点中最后访问的那个顶点出发, 继续作逆向的深度优先遍历,直至有向图中所有顶 点都被访问到为止。
Data StructureLeabharlann Baidu
克鲁斯卡尔(Kruskal)算法
基本思想:设无向连通网为G=(V, E),令G的最小生 成树为T=(U, TE),其初态为U=V,TE={ },然后, 按照边的权值由小到大的顺序,考察G的边集E中的各 条边。若被考察的边的两个顶点属于T的两个不同的连 通分量,则将此边作为最小生成树的边加入到T中,同 时把两个连通分量连接为一个连通分量;若被考察边 的两个顶点属于同一个连通分量,则舍去此边,以免 造成回路,如此下去,当T中的连通分量个数为1时, 此连通分量便为G的一棵最小生成树。
1. count=0; 2. for (图中每个顶点v)
2.1 if (v尚未被访问过) 2.1.1 count++; 2.1.2 从v出发遍历该图;
3. if (count==1) printf("图是连通的“); else printf("图中有count个连通分量");
《数据结构》
有向图的连通性
《数据结构》
Data Structure
克鲁斯卡尔(Kruskal)算法
34 B 12
B
A 19
26 E A
E
F
F
46 25
25 38
C
D
17
C
D
连通分量={A}, {B}, {C}, {D}, {E}, {F}
《数据结构》
Data Structure
克鲁斯卡尔(Kruskal)算法
34 B 12
2.2.1 将边(u,v)并入TE; 2.2.2 将这两个连通分量合为一个; 2.3 在E中标记边(u,v),使得(u,v)不参加后续最 短边的选取;
数组adjvex[n]:用来保存依附于该边(集合V-U中各 顶点与集合U中顶点的最短边)在集合U中的顶点。
如何用数组lowcost和adjvex表示候选最短边集?
lowcost[i]=w 表示顶点vi和顶点vk之间的权值为w, adjvex[i]=k 其中:vi∈ V-U 且vk ∈U
《数据结构》
Data Structure
普里姆(Prim)算法
i
数组
B(i=1) C(i=2) D(i=3) E(i=4) F(i=5)
adjvex A A A A A lowcost 34 46 ∞ ∞ 19
adjvex A
F
F
F
lowcost 34 25 25 26
U
{A} {A, F}
V-U
输出
{B, C, D, E,
E
F
F
46 25
25 38
C
D
17
C
D
17
连通分量={A}, {B, E}, {C}, {D}, {F}
连通分量={A}, {B, E}, {C, D}, {F}
《数据结构》
Data Structure
克鲁斯卡尔(Kruskal)算法
34 B 12
B 12
A 19
26 E A 19
E
F
F
46 25
最小生成树(Minimum Spanning Tree, MST):在图G 所有生成树中,代价最小的生成树称为最小生成树。
最小生成树的概念可以应用到许多实际问题中。 例:在n个城市之间建造通信网络,至少要架设n-1条通 信线路,而每两个城市之间架设通信线路的造价是不 一样的,那么如何设计才能使得总造价最小?
3.1 在lowcost中选取最短边,取adjvex中对应的顶点序号k; 3.2 输出顶点k和对应的权值; 3.3 将顶点k加入集合U中; 3.4 调整数组lowcost和adjvex;
《数据结构》
主要内容
Data Structure
1. 图的连通性 2. Prim算法 3. Kruskal算法
《数据结构》
《数据结构》 Data Structure
第十四讲 图的生成树
主讲:朱郑州
《数据结构》
主要内容
Data Structure
1. 图的连通性 2. Prim算法 3. Kruskal算法
《数据结构》
无向图的连通性
Data Structure
要想判定一个无向图是否为连通图,或有几个连通 分量,通过对无向图遍历即可得到结果。
《数据结构》
最小生成树性质
Data Structure
假设G=(V, E)是一个无向连通网,U是顶点集V的一 个非空子集。若(u, v)是一条具有最小权值的边,其 中u∈U,v∈V-U,则必存在一棵包含边(u, v)的最 小生成树。
T1
u
顶 点 集 U
u'
T2 v
v'
顶 点 集 V-U
《数据结构》
《数据结构》
Data Structure
普里姆(Prim)算法
34 B 12
A 19
26 E
F
46 25
25 38
C
D
17
U={A, F, C, D, E, B} V-U={ }
《数据结构》
Data Structure
普里姆(Prim)算法
数据结构设计
数组lowcost[n]:用来保存集合V-U中各顶点与集合U 中顶点最短边的权值,lowcost[v]=0表示顶点v已加入 最小生成树中;
D
17
连通分量={A, F}, {B, E}, {C, D}
连通分量={A, F, C, D}, {B, E}
《数据结构》
Data Structure
克鲁斯卡尔(Kruskal)算法
34 B 12
B 12
A 19
26 E A 19
26 E
F
F
46 25
25 38
25
C
D
17
C
D
17
连通分量={A, F, C, D}, {B, E}
cost={(A, B)34, (A, C)46, (A, D)∞,(A, E)∞,(A, F)19}
《数据结构》
Data Structure
普里姆(Prim)算法
34 B 12
A 19
26 E
F
46 25
25 38
C
D
17
U={A, F}
V-U={B, C, D, E}
cost={(A, B)34,(F, C)25, (F, D)25,(F, E)26}
连通分量={A, F, C, D, B, E}
《数据结构》
Data Structure
克鲁斯卡尔(Kruskal)算法
Kruskal算法——伪代码
1. 初始化:U=V; TE={ }; 2. 循环直到T中的连通分量个数为1
2.1 在E中寻找最短边(u,v); 2.2 如果顶点u、v位于T的两个不同连通分量,则
✓ 由深度优先遍历得到的为深度优先生成树,
由广度优先遍历得到的为广度优先生成树。
✓ 一个连通图的生成树可能不唯一,由不同的 遍历次序、从不同顶点出发进行遍历都会得到 不同的生成树。
✓ 对于非连通图,通过图的遍历,将得到的是 生成森林。
《数据结构》
最小生成树
Data Structure
生成树的代价:设G=(V,E)是一个无向连通网,生 成树上各边的权值之和称为该生成树的代价。
➢连通图:仅需从图中任一顶点出发,进行深度优 先搜索(或广度优先搜索),便可访问到图中所 有顶点。
➢非连通图:需从多个顶点出发进行搜索,而每一 次从一个新的起始点出发进行搜索过程中得到的顶 点访问序列恰为其各个连通分量中的顶点集。
《数据结构》
无向图的连通性
Data Structure
求无向图的连通分量
相关文档
最新文档