最小生成树PPT演示最终
合集下载
数据结构15--最小生成树PPT课件
proc Union(i,j,c:longint); /*合并i和j所在集合 */
Var x,y:longint;
{ x←top(i); y←top(j); 点j所在子树的根*/
/*分别取出顶点i和顶
if x<>y Then { inc(ans,c);f[y]←x;}; /*若i 和j分属于两棵子树,则该边权计入最小生成树的权和, 两棵子树合并*/
Writeln(ans);
显然, Kruskal算法的效率取决于边数m,因此适用与
稀疏图。
.
②、Prim算法
集合A中的边总是只形成单棵树,每次添加到 树中的边都是使树的权尽可能小的边。
.
设 d[i]—顶点i与生成树相连的最短边长; ba[i]—顶点i在生成树的标志; w[i,j]—(i,j)的边长。若图中不存在边 (i,j),则w[i,j]=∞ min—所有未在生成树的顶点的最小距离 值
top←f[i]; /*返回顶点i所在并查集的代表 顶点*/ };/*top*/
.
通过过程Union(i,j,c)合并顶点i和顶点j所 在的两棵树
现有边权为c的边(i,j)。若该边的两个端点 分属于两棵树,顶点i和顶点j所在子树的根分别 为x和v,则(i,j) 加入最小生成树,合并两棵树 (即顶点i和顶点j所在的并查集)。
for j←1 to n do
if not ba[j]and(d[j]<min) then { k←j;min←d[j] }; /*then*/
if min= maxint then { ans←-1;break;};/*若这样的顶点不存 在,则无解退出*/
ans←ans+min;ba[k]←true;/*最小距离值min计入生成树的权和, 顶点k进入生成树*/
数据结构 耿国华 西北大学 7-5最小生成树-动画演示
5
6
小 D 6 6 18 14
生 成 树
E F
1291
11
18 14
33
33
Step1. 初始化。选取种子 顶点,种子顶点构成最优 路段网,其余顶点构成外 围网。初始化Closedge。
A
16 B
21
1
2
3
4
5
6
A A A A A A U 19
F
C
A B C D E FV
0 16 ∞ ∞ 19 21 w
Closedge数组
F
21 Step3. 更新Closedge, 11 确保每组边是最优路段网
到外围网路径中最小的。
14
33
A
16
B
5
6
11
AB U 19
F
C
FV
6
2111 w
E
D
最小生成树——Prim算法
AB C DE
A 16 19
B 16 5 6
最M
C
5
6
Hale Waihona Puke 小 D 6 6 18E
D
Closedge数组
最小生成树——Prim算法
AB C DE
A 16 19
B 16 5 6
最M
C
5
6
小 D 6 6 18
生 成 树
E F
1291
11
18 14
33
1
2
3
4
5
A A AB AB A
ABCDE
0 0 ∞5 ∞6 19
Closedge数组
F
21 Step3. 更新Closedge, 11 确保每组边是最优路段网
最小生成树MinimumSpanningTree
4
1、Prim算法
如何找轻边?
❖可能的紫边集
设红点集|U|=k, 白点集|V-U|=n-k,则可能的紫边 数为:k(n-k)。
在此紫边集中选择轻边效率太低。
❖构造候选轻边集 构造较小的紫边集,但保证轻边在其中。
因为,∀v∈白点集,从v到各红点的紫边中,只 有最短的那一条才可能是轻边,所以只须保留所有n -k个白点所关联的最短紫边作为轻边候选集即可。
int fromvex, tovex; //起点、终点 int len; //边长度,权值 } MST[n-1];
设邻接矩阵初值:不存在的边其权值为Infinity
9
1、Prim算法
算法求精-初始化
将根r涂红加入红点集U,TE=φ。 对每个白点i (0≤i ≤n-1, i≠r ), i所关联的最短紫边(r,i)的 长度为G[r][i], 这n-1条最短紫边构成了初始的候选轻边集。 因为树边为空,故将T[0..n-2]全部用来存放候选轻边集。
151
3
2
5
2 4
4
5
0
151 2
5 4
5 3
4 5
0
151
3
3
2
2
4
4
5
8
1、Prim算法
存储结构
#define Infinity INT_MAX //表示最大整数 #define n 100 typedef int AdjMatrix[n][n]; //邻接矩阵 typedef struct { //树边
增加一局部向量indegree[0..n]保存各顶点的当前入度
或者在邻接表的顶点表中增加入度域
用栈(或队列)来保存所有入度为0的顶点,以免每次选入度为0的顶点 时扫描整个indegree向量 void NonPreFirstTopSort(ALGraph G){ //以下vi简称为i int indegree[MaxVertexNum],i,j,count=0; SeqStack S; EdgeNode *p;
1、Prim算法
如何找轻边?
❖可能的紫边集
设红点集|U|=k, 白点集|V-U|=n-k,则可能的紫边 数为:k(n-k)。
在此紫边集中选择轻边效率太低。
❖构造候选轻边集 构造较小的紫边集,但保证轻边在其中。
因为,∀v∈白点集,从v到各红点的紫边中,只 有最短的那一条才可能是轻边,所以只须保留所有n -k个白点所关联的最短紫边作为轻边候选集即可。
int fromvex, tovex; //起点、终点 int len; //边长度,权值 } MST[n-1];
设邻接矩阵初值:不存在的边其权值为Infinity
9
1、Prim算法
算法求精-初始化
将根r涂红加入红点集U,TE=φ。 对每个白点i (0≤i ≤n-1, i≠r ), i所关联的最短紫边(r,i)的 长度为G[r][i], 这n-1条最短紫边构成了初始的候选轻边集。 因为树边为空,故将T[0..n-2]全部用来存放候选轻边集。
151
3
2
5
2 4
4
5
0
151 2
5 4
5 3
4 5
0
151
3
3
2
2
4
4
5
8
1、Prim算法
存储结构
#define Infinity INT_MAX //表示最大整数 #define n 100 typedef int AdjMatrix[n][n]; //邻接矩阵 typedef struct { //树边
增加一局部向量indegree[0..n]保存各顶点的当前入度
或者在邻接表的顶点表中增加入度域
用栈(或队列)来保存所有入度为0的顶点,以免每次选入度为0的顶点 时扫描整个indegree向量 void NonPreFirstTopSort(ALGraph G){ //以下vi简称为i int indegree[MaxVertexNum],i,j,count=0; SeqStack S; EdgeNode *p;
图论课件--最小生成树共37页文档
图论课件--最小生成树
16、人民应该为法律而战斗,就像为 了城墙 而战斗 一样。 ——赫 拉克利 特 17、人类对于不公正的行为加以指责 ,并非 因为他 们愿意 做出这 种行为 ,而是 惟恐自 己会成 为这种 行为的 牺牲者 。—— 柏拉图 18、制定法律法令,就是为了不让强 者做什 么事都 横行霸 道。— —奥维 德 19、法律是社会的习惯和思想的结晶 。—— 托·伍·威尔逊 20、人们嘴上挂着的法律,其真实含加强。 ——德 谟克利 特 67、今天应做的事没有做,明天再早也 是耽误 了。——裴斯 泰洛齐 68、决定一个人的一生,以及整个命运 的,只 是一瞬 之间。 ——歌 德 69、懒人无法享受休息之乐。——拉布 克 70、浪费时间是一桩大罪过。——卢梭
最小生成树-数学建模.ppt
用Kruskal算法可求出最小生成树,在前面 给出的Kruskal算法的MATLAB程序中,边权矩阵b 的值改为此处的边权矩阵,顶点数n改为9即可。
上一页 下一页 主 页
T= 7 8 15 12 39 46 47 45 13
c = 4.4300
机器的分组:{3, 9},
{1,2,5},
{4,6,7,8}。
返回
整理边权矩阵
初始化:j0, T, c0, k0; 对所有顶点i ,t(i)i .
B: 图的边权矩阵; T: 生成树的边集; C: 生成树的权; t: 顶点所属子树的编号
jj+1
t(B(1,j))t(B(2,j)) Y
N
TT(B(1,j),B(2,j)), cc+B(3,j),kk+1,i 0
i i+1
引例:计算机网络的线路设计
最小生成树
最大生成树 1) 一个完全图Kn有多少不同 的生成树? 2) 如何求其最小生成树?
引例:计算机网络的线路设计
10个顶点的完全图,其不同的生成树就有 一亿棵。
一般地,n个顶点的完全图,其不同的生成 树个数为nn-2。
30 个 顶 点 的 完 全 图 就 有 3028 个 生 成 树 , 求 最小生成树时用穷举法是无效的。
假设有13种零件,需在9台机器上 加工。在各台机器上加工的零件号在下 表中给出。
范例:制造系统的分组技术
机器 1 2 3 4 5 6 7 8 9
加工 2,3, 2,7, 1,6 3, 3,7, 5 4, 4, 6
的零 7,8, 8, 件 9, 11,1
12, 2
5, 8,9, 10 12,
13
10 10
3
上一页 下一页 主 页
T= 7 8 15 12 39 46 47 45 13
c = 4.4300
机器的分组:{3, 9},
{1,2,5},
{4,6,7,8}。
返回
整理边权矩阵
初始化:j0, T, c0, k0; 对所有顶点i ,t(i)i .
B: 图的边权矩阵; T: 生成树的边集; C: 生成树的权; t: 顶点所属子树的编号
jj+1
t(B(1,j))t(B(2,j)) Y
N
TT(B(1,j),B(2,j)), cc+B(3,j),kk+1,i 0
i i+1
引例:计算机网络的线路设计
最小生成树
最大生成树 1) 一个完全图Kn有多少不同 的生成树? 2) 如何求其最小生成树?
引例:计算机网络的线路设计
10个顶点的完全图,其不同的生成树就有 一亿棵。
一般地,n个顶点的完全图,其不同的生成 树个数为nn-2。
30 个 顶 点 的 完 全 图 就 有 3028 个 生 成 树 , 求 最小生成树时用穷举法是无效的。
假设有13种零件,需在9台机器上 加工。在各台机器上加工的零件号在下 表中给出。
范例:制造系统的分组技术
机器 1 2 3 4 5 6 7 8 9
加工 2,3, 2,7, 1,6 3, 3,7, 5 4, 4, 6
的零 7,8, 8, 件 9, 11,1
12, 2
5, 8,9, 10 12,
13
10 10
3
最小生成树算法详解(课堂PPT)
0 0 0 0 0 {v1,v3,v6,v4,v2,v5}
{}
21
普里姆算法求最小生成树
• 图采用邻接矩阵表示
6 v2
5 3
6 v5
v1 5
1 v4 5
v3 42
6 v6
1
2
graph. arac[][] =
3 4
5
6
123456
∞ 6 1 5∞∞ 6 ∞5∞3 ∞ 1 5∞5 6 4 5 ∞ 5 ∞∞ 2 ∞ 3 6 ∞∞ 6 ∞∞4 2 6 ∞
6
adjvex lowcost
v3 5
0
v6 2
v3 6
0
{v1,v3,v6}
{v2,v4,v5 }
4
adjvex lowcost
v3 5
0
0
v3 6
0
{v1,v3,v6,v4}
{v2,v5 }
2
adjvex lowcost
0
0
0
v2 3
0
{v1,v3,v6,v4,v2}
{v5 }
5
adjvex lowcost
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
6
最小代价生成树
V1
1
普里姆算法求最小生成树:从
V3
生成树中只有一个顶点开始,
到顶点全部进入生成树为止
V1
6
5
1
V2
V4
V3
V5
V6
步骤 (0) (1)
U
V-U
{V1 } { V2 ,V3 ,V4 , V5 ,V6 } {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
最小生成树PPT演示
18
克鲁斯卡尔算法
• 克鲁斯卡尔算法从另一途径求网的最小生 成树。假设连通网N=(V,{E}),则令最小生成树 的初始状态为只有n个顶点而无边的非连通 图T=(V,{}),图中每个顶点自成一个连通分量 。在E中选择代价最小的边,若该边依附的 顶点落在T中不同的连通分量上,则将此边 加入到T中,否则舍去此边而选择下一条代 价最小的边。以此类推,直至T中所有顶点 都在同一连通分量上为止。
李昕翼: 撰写报告 提问问题
3
最小连接问题
• 交通网络中,常常关注能把所有站点连接 起来的生成树,使得该生成树各边权值之 和为最小。例如:
• 假设要在某地建造5个工厂,拟修筑道路连接这5 处。经勘探,其道路可按无向边铺设。现在每条 边的长度已经测出并标记在对应边上,如果我们 要求铺设的道路总长度最短,如何铺设?
10
V1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost
V3 5 0
6 6
4
V6
v6
V3 4
2
v3
v4
V1 5
v5
V3 6
U
{V1, V3}
V-U
{V2,V4 ,V5,V6}
k
v6
11
V1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost
V3 5
6 6
4
V6
v6
2
v3
v4
V6
v5
V3 6
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
背景知识
• 最小生成树:在连通边赋权图G 中求一棵总权值 最小的生成树 。该生成树称为最小生成树或 最小代价树。
构造最小生成树的思想
• 构造最小生成树可以有多种算法。其中多数 算法利用了最小生成树的一种简称为MST的 性质:假设N=(V,{E})是一个连通网(v代表顶点 集,E代表边集),U是顶点集V的一个非空子 集。若(u,v)是一条具有最小权值的边,其中 u∈U,v∈V-U,则必存在一棵包含边(u,v)的最 小生成树。
5 4
V4
3
V5
2
V6
1 edgeco st adjvex 1 v1,v 3 2 2 v4,v 6 3 3 v2,v 5 4 4 v3,v 6 5 5 v3,v 4 6 5 v2,v 3
6
V1
6
V2
5
5 6 1
V3
5
V4
3
V5
4
6
V6
2
1 edgeco st adjvex 1 2 2 3 3 4 4 5 5 6 5 v2,v 3
普里姆算法
• 利用该图 按普里姆 算法构造 一棵最小 生成树
6 5 3
5 1
5
4 2
6 6
V1
6Leabharlann V251 5V3
5
V4
3
V5
i
v2 closedge adjvex lowcost
V1 6 V1 1
6 6
4
V6
v6
2
v3
v4
V1 5
v5
U
{V1}
V-U
{V2,V3 ,V4,V5, V6}
k
v3
V1
v4,v6 v5,v6
利用堆排序后结果:
1 edgecost adjvex 1 v1,v3 2 2 v4,v6 3 3 v2,v5 4 4 v3,v6 5 5 v3,v4 6 5 v2,v3 7 5 v1,v4 8 6 v3,v5 9 6 10 6
v5,v6 v1,v2
V1
6
V2
5
5 6 1
V3
普里姆算法分析
• 假设网中有n个顶点,则第一个进行初 始化的循环语句的频度为n,第二个循 环语句的频度为n-1;其中有两个内循 环:其一是在closedge[v].lowcost中求 最小值,其频度为n-1;其二是重新选择 具有最小代价的边,其频度为n。由此 ,普里姆算法的时间复杂度为O(n²),与 网中的边数无关,因此适用于求边稠 密的网的最小生成树。
Solin 算法
Rosenstiehl
和 管梅谷 算法
Dijkstra 算法
最小生成树的其他求解方法
Solin算法
• 此算法的基本思路是:将求连通带权图的最 小生成树的过程分为若干阶段,每一阶段选 取若干条边。具体步骤如下: • (1)将每个顶点视为一棵树,图中所有顶点 视为一个森林; • (2)为每棵树选取一条边,它是该树与其他 树相连的所有边中权值最小的一条边,把该 边生成树中。如果某棵树选取的边已经被其 他树选过,该边不再选取。整个森林变成一 棵树。 • 重复操作(2),直到整个森林变成一棵树。
克鲁斯卡尔算法
• 克鲁斯卡尔算法从另一途径求网的最小生 成树。假设连通网N=(V,{E}),则令最小生成树 的初始状态为只有n个顶点而无边的非连通 图T=(V,{}),图中每个顶点自成一个连通分量 。在E中选择代价最小的边,若该边依附的 顶点落在T中不同的连通分量上,则将此边 加入到T中,否则舍去此边而选择下一条代 价最小的边。以此类推,直至T中所有顶点 都在同一连通分量上为止。
讨论课题:
最小生成树的求解方法与分析
目录
01
02
背景知识
03
最小生成树的求 解方法与分析
组内成员 分工介绍
组内成员及分工介绍:
组 长
组 员
组 员
组 员
组 员
刘先喆: 陈静: 何安琪: 韩佳文: 编写最小 汇报演讲、 制作PPT、 撰写报告 生成树求 制作PPT 分析算法、 提问问题 解方法、 探索其他 回答问题 解决方法
0
0
6
0
V1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost 0 0 v3
6 6
4
V6
v6
2
v4
v5
U
V-U
k
V2
0
3
0
{V1,V3 ,V6,V4, V2}
{V5}
v5
V1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost 0 0 v3
克鲁斯卡尔算法
• 利用该图 按克鲁斯 卡尔算法 构造一棵 最小生成 树
6 5 3
5 1 5 4 2
6 6
各边权值的堆排
6 1 5 4
1 edgecost adjvex 6 v1,v2 2 1 v1,v3
5 3 5 6
2
3 5 v1,v4
6
4 5 v3,v4 5 3 v2,v5 6 5 v2,v3 7 6 v3,v5 8 4 v3,v6 9 2 10 6
Dijkstra算法
• Dijkstra算法的基本思路是;对于一个连通 网络N={V,E},把E中所有 的边以方便的次序 逐个加入到初始值为空的生成树的边集合T 中。每次选择并加入一条边时,需判断它 是否与先前加入T中的边构成回路。如果构 成了回路,则从这个回路中将权值最大的 边退选。如此重复,直到T中有n-1条边为止 ,其中n是V中顶点个数。
v4,v v2,v 6 5
v3,v v2, 4 v3
V1
6
V2
5
5 5 6 1
V3
5
V4
3
V5
4
6
V6
2
1 edgeco st adjvex 1 v1, v3 2 2 3 3 4 4 v3, v6 5 5 v3, v4 6 5 v2,v 3
v4,v v2,v 6 5
克鲁斯卡尔核心算法
• for(i=0;i<G.vexnum;i++)//各顶点集初始化 • flag[i]=i; • for(i=G.arcnum,count=1;count<G.vexnum;i--) • { • j=G.arcs[i].v1;k=G.arcs[i].v2; • if(flag[j]!=flag[k])//两个点属于不同集合 • { • printf("(%s-%s)%d\n",G.vexs[j],G.vexs[k],G.arcs[i].value); • count++; • for(l=0;l<G.vexnum;l++) • if(flag[l]==flag[k])//将点k所在集合的点并入j所 在集合 • flag[l]=flag[j]; • } • }
v1,v v4,v 3 6
v2,v v3,v v3,v 5 6 4
V1
6
V2
5
5 6 1
V3
5
V4
3
V5
4
6
V6
2
1 edgec ost adjvex 1 v1, v3 2 2 v4,v 6 3 3 4 4 5 5 6 5 v2,v 3
v2,v v3,v v3,v 5 6 4
V1
6
V2
5
5 6 1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost
V3 5 0
6 6
4
V6
v6
V3 4
2
v3
v4
V1 5
v5
V3 6
U
{V1, V3}
V-U
{V2,V4 ,V5,V6}
k
v6
V1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost
V3 5
李昕翼: 撰写报告 提问问题
最小连接问题
• 交通网络中,常常关注能把所有站点连接 起来的生成树,使得该生成树各边权值之 和为最小。例如:
• 假设要在某地建造5个工厂,拟修筑道路连接这5 处。经勘探,其道路可按无向边铺设。现在每条 边的长度已经测出并标记在对应边上,如果我们 要求铺设的道路总长度最短,如何铺设?
6 6
4
V6
v6
2
v4
v5
U
V-U
{}
k
0
0
0
{V1,V3,V 6,V4,V2, v5}
普里姆核心算法
• // 用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边 • void MiniSpanTree_PRIM(MGraph G,VertexType u) • { • int i,j,k; • Closedge closedge; • k=LocateVex(G,u); • for(j=0;j<G.vexnum;++j) // 辅助数组初始化 • { • if(j!=k) • { • strcpy(closedge[j].adjvex,u); • closedge[j].lowcost=G.arcs[k][j].adj; • } • } ..\..\普里姆算法\普里姆 .cpp
• closedge[k].lowcost=0; // 初始时,U={u} • printf("最小代价生成树的各条边为:\n"); • for(i=1;i<G.vexnum;++i) • { // 选择其余G.vexnum-1个顶点 • k=MiniNum(closedge,G); // 求出T的下一个结点:第K顶点 • printf("(%s%s)%d\n",closedge[k].adjvex,G.vexs[k],closedge[k].lowcost); // 输出生成树的边 • closedge[k].lowcost=0; // 第K顶点并入U集 • for(j=0;j<G.vexnum;++j) • if(G.arcs[k][j].adj<closedge[j].lowcost) • { • // 新顶点并入U集后重新选择最小边 • strcpy(closedge[j].adjvex,G.vexs[k]); • closedge[j].lowcost=G.arcs[k][j].adj; • } • } • }