最小生成树
最小生成树MinimumSpanningTree

8
1、Prim算法
算法求精-初始化
将根r涂红加入红点集U,TE=φ。
对每个白点i (0≤i ≤n-1, i≠r ), i所关联的最短紫边(r,i)的 长度为G[r][i], 这n-1条最短紫边构成了初始的候选轻边集。
因为树边为空,故将T[0..n-2]全部用来存放候选轻边集。
❖设V(G)={0,1,…,n-1}
❖算法的每一步均是在连接红、白点集的紫 边中选一轻边扩充到T(贪心),T从任意 一点r开始(r为根),直至U=V为止。 MST性质保证了贪心选择策略的正确性。
3
1、Prim算法
如何找轻边?
❖可能的紫边集
设红点集|U|=k, 白点集|V-U|=n-k,则可能的紫边 数为:k(n-k)。
//将(u,v)涂红加入树中,白点v加入红点集
ModifyCandidateSet(…);
//根据新红点v调整候选轻边集
}
}
算法终止时U=V,T=(V,TE)
6
1、Prim算法
实例
6 1
5
35 4
05
1
3
27 2
4
5
6
60 5
1
1
3
∞2
∞
4
5
0
151
3
2
5
2 4
4
5
0
151
3
2
5
2 4
4
5
0
151 2
int i, minpos, min=Infinity; for (i=k; i<n-1; i++) //遍历候选集找轻边
最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)

最⼩⽣成树---普⾥姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)最⼩⽣成树的性质:MST性质(假设N=(V,{E})是⼀个连通⽹,U是顶点集V的⼀个⾮空⼦集,如果(u,v)是⼀条具有最⼩权值的边,其中u属于U,v属于V-U,则必定存在⼀颗包含边(u,v)的最⼩⽣成树)普⾥姆算法(Prim算法)思路:以点为⽬标构建最⼩⽣成树1.将初始点顶点u加⼊U中,初始化集合V-U中各顶点到初始顶点u的权值;2.根据最⼩⽣成树的定义:从n个顶点中,找出 n - 1条连线,使得各边权值最⼩。
循环n-1次如下操作:(1)从数组lowcost[k]中找到vk到集合U的最⼩权值边,并从数组arjvex[k] = j中找到该边在集合U中的顶点下标(2)打印此边,并将vk加⼊U中。
(3)通过查找邻接矩阵Vk⾏的各个权值,即vk点到V-U中各顶点的权值,与lowcost的对应值进⾏⽐较,若更⼩则更新lowcost,并将k存⼊arjvex数组中以下图为例#include<bits/stdc++.h>using namespace std;#define MAXVEX 100#define INF 65535typedef char VertexType;typedef int EdgeType;typedef struct {VertexType vexs[MAXVEX];EdgeType arc[MAXVEX][MAXVEX];int numVertexes, numEdges;}MGraph;void CreateMGraph(MGraph *G) {int m, n, w; //vm-vn的权重wscanf("%d %d", &G->numVertexes, &G->numEdges);for(int i = 0; i < G->numVertexes; i++) {getchar();scanf("%c", &G->vexs[i]);}for(int i = 0; i < G->numVertexes; i++) {for(int j = 0; j < G->numVertexes; j++) {if(i == j) G->arc[i][j] = 0;else G->arc[i][j] = INF;}}for(int k = 0; k < G->numEdges; k++) {scanf("%d %d %d", &m, &n, &w);G->arc[m][n] = w;G->arc[n][m] = G->arc[m][n];}}void MiniSpanTree_Prim(MGraph G) {int min, j, k;int arjvex[MAXVEX]; //最⼩边在 U集合中的那个顶点的下标int lowcost[MAXVEX]; // 最⼩边上的权值//初始化,从点 V0开始找最⼩⽣成树Tarjvex[0] = 0; //arjvex[i] = j表⽰ V-U中集合中的 Vi点的最⼩边在U集合中的点为 Vjlowcost[0] = 0; //lowcost[i] = 0表⽰将点Vi纳⼊集合 U ,lowcost[i] = w表⽰ V-U中 Vi点到 U的最⼩权值for(int i = 1; i < G.numVertexes; i++) {lowcost[i] = G.arc[0][i];arjvex[i] = 0;}//根据最⼩⽣成树的定义:从n个顶点中,找出 n - 1条连线,使得各边权值最⼩for(int i = 1; i < G.numVertexes; i++) {min = INF, j = 1, k = 0;//寻找 V-U到 U的最⼩权值minfor(j; j < G.numVertexes; j++) {// lowcost[j] != 0保证顶点在 V-U中,⽤k记录此时的最⼩权值边在 V-U中顶点的下标if(lowcost[j] != 0 && lowcost[j] < min) {min = lowcost[j];k = j;}}}printf("V[%d]-V[%d] weight = %d\n", arjvex[k], k, min);lowcost[k] = 0; //表⽰将Vk纳⼊ U//查找邻接矩阵Vk⾏的各个权值,与lowcost的对应值进⾏⽐较,若更⼩则更新lowcost,并将k存⼊arjvex数组中for(int i = 1; i < G.numVertexes; i++) {if(lowcost[i] != 0 && G.arc[k][i] < lowcost[i]) {lowcost[i] = G.arc[k][i];arjvex[i] = k;}}}int main() {MGraph *G = (MGraph *)malloc(sizeof(MGraph));CreateMGraph(G);MiniSpanTree_Prim(*G);}/*input:4 5abcd0 1 20 2 20 3 71 2 42 3 8output:V[0]-V[1] weight = 2V[0]-V[2] weight = 2V[0]-V[3] weight = 7最⼩总权值: 11*/时间复杂度O(n^2)克鲁斯卡尔算法(Kruskal算法)思路:以边为⽬标进⾏构建最⼩⽣成树在边集中依次寻找最⼩权值边,若构建是不形成环路(利⽤parent数组记录各点的连通分量),则将其添加到最⼩⽣成树中。
最小生成树的概念

最小生成树的概念
在图论中,最小生成树是一个连通图的生成树,其边的权值之和最小。
通俗地说,最
小生成树是指在一个图中找到一棵权值最小的生成树,这个生成树包含了连通图的所有顶点,且边的数量最小。
怎么找到最小生成树呢?有两种常用算法:Prim算法和Kruskal算法。
Prim算法首先任选一个点作为起点,然后在剩余的点中选择与当前集合距离最短的点加入集合,直到所有点被加入。
在加入每一个点时,找到与当前集合连接的距离最短的边,加入到生成树中。
重复以上步骤,直到所有点都被加入到生成树中。
Kruskal算法则是将边按照权值从小到大排序,选择权值最小的边加入到生成树中,
如果加入当前边后不构成环,则加入,否则继续找下一条权值最小的边。
重复以上步骤,
直到所有点都被加入到生成树中。
最小生成树有很广泛的应用,如在通信、传输、路网规划等领域都有很重要的作用。
在有些应用中,最小生成树不仅要求边的权值之和最小,还要满足一些约束条件,比如边
的数量、每个点的度数等,这时我们需要采用更加复杂的算法来求解问题。
最小生成树的应用非常广泛,比如在计算机网络中,路由协议需要找到最短的数据传
输路径;在城市交通中,规划出最优的交通路径能够有效减少能源的消耗;在电力系统中,设计最短的输电线路可以节省能源成本。
最小生成树的运用如此广泛,它不仅在计算机科
学中有重要作用,也在其他各个领域有着不可替代的作用。
最小生成树

如此进行下去,每次往生成树里并入一 个顶点和一条边,直到n-1次后,把所有 n 个顶点都并入生成树T的顶点集U中, 此时U=V,TE中包含有(n-1)条边;
图
图6.10 图G 及其生成树
无向连通图 G 图
➢ 生成树
图6.10 图G 及其生成树
生成树
➢ 最小生成树
图
1.1 普里姆(prim)算法
假设G=(V,E)是一个具有n 个顶点的连通网络, T=(U,TE)是G的最小生成树,其中U是T的顶点 集,TE是T的边集,U和TE的初值均为空。
算法开始时,首先从V中任取一个顶点(假定 为V1),将此顶点并入U中,此时最小生成树 顶点集U={V1};
这样,T就是最后得到的最小生成树。
普里姆算法中每次选取的边两端,总是 一个已连通顶点(在U集合内)和一个未 连通顶点(在U集合外),故这个边选取 后一定能将未连通顶点连通而又保证不 会形成环路。
图
图6.11 普里姆算法例子
图
为了便于在顶点集合U和V-U之间选择权 最小的边,建立两个数组closest和 lowcost,closest[i]表示U中的一个顶点,该 顶点与V-U中的一个顶点构成的边具有最 小的权;lowcost表示该边对应的权值。
姆
{
算
min=lowcost[j];
法
k=j;
续
} printf(“(%d,%d)”,k,closest[j]);
/* 打印生成树的一条边*/
最短路径与最小生成树的区别

最短路径与最小生成树的区别
在图论中,最短路径和最小生成树是两个重要的概念。
它们都是用来解决图中节点之间的距离问题,但是它们的解决方法和目的却有所不同。
最短路径问题是指在一个有向或无向加权图中,找到从一个节点到另一个节点最短的路径。
最短路径可以使用Dijkstra算法和Bellman-Ford算法来解决。
这类问题通常是求出从一个节点到其他节点的最短距离,通常用于网络路由、GPS导航等应用。
最小生成树问题是指在一个无向加权图中,找到一个生成树,使得该树中的所有边权之和最小。
最小生成树可以使用Prim算法和Kruskal算法来求解。
这类问题通常是在需要将图连接起来的场合,比如铺设电缆、通信网络等场合。
因此,最短路径问题和最小生成树问题虽然都与计算节点间距离有关,但是它们的解决方法和应用场景却有很大的差异。
在具体应用中,需要根据实际情况选择合适的算法和方法来解决问题。
- 1 -。
离散数学最小生成树例题

离散数学最小生成树例题(实用版)目录1.最小生成树的概念和性质2.最小生成树的算法原理3.最小生成树的算法举例4.最小生成树的应用实例正文一、最小生成树的概念和性质最小生成树(Minimum Spanning Tree,简称 MST)是指在一个加权连通图中,选择一些边,使得所有节点都能被联通,并且边代价之和最小。
最小生成树具有以下性质:1.树中的边是最短的边:在生成树中,任意两个节点之间的边都是最短的边,即不存在比这条边更短的边能连接这两个节点。
2.树是没有圈的:最小生成树显然不应该有圈,因为如果有圈,可以通过删除圈中的一条边来形成一个更小的生成树。
二、最小生成树的算法原理求解最小生成树的经典算法有 Kruskal 算法和 Prim 算法。
这里我们以 Prim 算法为例介绍最小生成树的算法原理。
Prim 算法的基本思想是从一个初始节点开始,不断地寻找与当前生成树距离最近的节点,将其加入到生成树中,直到所有节点都加入到生成树中为止。
在寻找距离最近的节点时,我们需要使用贪心策略,即每次都选择距离最近的节点。
为了判断一个节点是否已经加入了生成树,我们可以使用并查集数据结构。
三、最小生成树的算法举例这里我们以一个简单的例子来说明 Prim 算法的求解过程。
假设有一个图,共有 4 个节点,5 条边,边的权值分别为 1, 2, 3, 4, 5。
我们选择节点 1 作为初始节点,按照 Prim 算法的步骤,可以得到最小生成树的权值为 9,生成树如下所示:```1 --2 --3 -- 4```四、最小生成树的应用实例最小生成树在实际应用中有很多实例,如网络路由、数据压缩、图像处理等。
这里我们以网络路由为例,介绍最小生成树的应用。
在网络中,为了提高传输效率,我们需要在网络中建立一条最短路径。
通过求解最小生成树,我们可以得到网络中的最短路径,从而为数据包的传输提供指导。
在求解最小生成树时,我们可以将网络中的节点看作是图的顶点,边看作是图的边,边的权值看作是节点之间的距离。
最小生成树(普里姆算法)

最⼩⽣成树(普⾥姆算法):所谓⽣成树,就是n个点之间连成n-1条边的图形。
⽽最⼩⽣成树,就是权值(两点间直线的值)之和的最⼩值。
⾸先,要⽤⼆维数组记录点和权值。
如上图所⽰⽆向图:int map[7][7];map[1][2]=map[2][1]=4;map[1][3]=map[3][1]=2;......然后再求最⼩⽣成树。
具体⽅法是:1.先选取⼀个点作起始点,然后选择它邻近的权值最⼩的点(如果有多个与其相连的相同最⼩权值的点,随便选取⼀个)。
如1作为起点。
visited[1]=1;pos=1;//⽤low[]数组不断刷新最⼩权值,low[i](0<i<=点数)的值为:i点到邻近点(未被标记)的最⼩距离。
low[1]=0; //起始点i到邻近点的最⼩距离为0low[2]=map[pos][2]=4;low[3]=map[pos][3]=2;low[4]==map[pos][4]=3;low[5]=map[pos][5]=MaxInt; //⽆法直达low[6]=map[pos][6]=MaxInt;2.再在伸延的点找与它邻近的两者权值最⼩的点。
//low[]以3作当前位置进⾏更新visited[3]=1;pos=3;low[1]=0; //已标记,不更新low[2]=map[1][2]=4; //⽐5⼩,不更新low[3]=2; //已标记,不更新low[4]=map[1][4]=3; //⽐1⼤,更新后为:low[4]=map[3][4]=1;low[5]=map[1][5]=MaxInt;//⽆法直达,不更新low[6]=map[1][6]=MaxInt;//⽐2⼤,更新后为:low[6]=map[3][6]=2;3.如此类推...当所有点都连同后,结果最⽣成树如上图所⽰。
所有权值相加就是最⼩⽣成树,其值为2+1+2+4+3=12。
⾄于具体代码如何实现,现在结合POJ1258例题解释。
最小生成树算法详解

最小生成树算法详解最小生成树(Minimum Spanning Tree,简称MST)是图论中的一个经典问题,它是指在一个加权连通图中找出一棵包含所有顶点且边权值之和最小的树。
在解决实际问题中,最小生成树算法被广泛应用于网络规划、电力传输、城市道路建设等领域。
本文将详细介绍最小生成树算法的原理及常见的两种算法:Prim算法和Kruskal算法。
一、最小生成树算法原理最小生成树算法的核心思想是贪心算法。
其基本原理是从图的某个顶点开始,逐步选取当前顶点对应的边中权值最小的边,并确保选取的边不会构成环,直到所有顶点都被连接为止。
具体实现最小生成树算法的方法有多种,两种常见的算法是Prim 算法和Kruskal算法。
二、Prim算法Prim算法是一种基于顶点的贪心算法。
它从任意一个顶点开始,逐渐扩展生成树的规模,直到生成整个最小生成树。
算法的具体步骤如下:1. 初始化一个空的生成树集合和一个空的顶点集合,将任意一个顶点加入到顶点集合中。
2. 从顶点集合中选择一个顶点,将其加入到生成树集合中。
3. 以生成树集合中的顶点为起点,寻找与之相邻的顶点中权值最小的边,并将该边与对应的顶点加入到最小生成树中。
4. 重复第3步,直到生成树中包含所有顶点。
Prim算法是一种典型的贪心算法,其时间复杂度为O(V^2),其中V为顶点数。
三、Kruskal算法Kruskal算法是一种基于边的贪心算法。
它首先将所有边按照权值从小到大进行排序,然后从小到大依次选择边,判断选取的边是否与已选取的边构成环,若不构成环,则将该边加入到最小生成树中。
算法的具体步骤如下:1. 初始化一个空的生成树集合。
2. 将图中的所有边按照权值进行排序。
3. 依次选择权值最小的边,判断其两个顶点是否属于同一个连通分量,若不属于,则将该边加入到最小生成树中。
4. 重复第3步,直到最小生成树中包含所有顶点。
Kruskal算法通过并查集来判断两个顶点是否属于同一个连通分量,从而避免形成环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2)图的生成树(或支撑树
Spanning Tree)
定义 若T是包含图G的全部顶点的子图,它又是树, 则称T是G的生成树. 图G中不在生成树的边叫做弦.
定理3 图G=(V,E)有生成树的充要条件是图G是连 通的.
证明 必要性是显然的.
充分性:任取 u1 V ,令集合V1 {u1},这时生成
1 1
图10
0 1 2 2 3 3 4 3 2 2 2 1
图10
b)广探法 例用广探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给u以标号0.令i=0. ii) 令所有标号i的点集为 Vi,检查[Vi,V\Vi]中的边端点 是否均已标号. 对所有未标 号之点均标以i+1,记下这些 边. iii) 对标号i+1的点重复步 步骤ii),直到全部点得到 标号为止.
1 1
图10
0 1 2 2 3 3 4 3 2 2 2 1
显然图10的生成树 不唯一.
B 破圈法
相对于避圈法,还有一种求生成树的方法叫做 “破圈法”. 这种方法就是在图G中任取一个圈, 任意舍弃一条边,将这个圈破掉,重复这个步骤 直到图G中没有圈为止. 取一圈{v1e1v2e3v3e2v1},去掉 e3 ; 例 用破圈法求出 取一圈{v1e1v2e4v4e5v3e2v1},去掉 e5 ; 下图的一棵生成树. 取一圈{v2e4v4e7v5e6v2},去掉e7 ;
从顶点a开始
步骤
u
L(b)
L(c)
L(d)
L(e)
L(f)
L(g)
e
V
T0
C(T0)
1
a
4
15
7
28
{a}
0
2
3 4 5 6 7
b
e c d g f
-
- - - - -
9
5 - - - -
32 25 - - -
7
- - - - -
16 16 -
28
28 28 12 - -
(a,b)
取一圈{v1e1v2e6v5e8v3e2v1},去掉 e6 .
B 破圈法
例 用破圈法求出下图的另一棵生成树.
取一圈{v1e1v2e3v3e2v1}, 去掉 e3 ; 取一圈{v1e1v2e4v4e5v3e2v1},去掉 e4 ; 取一圈{v1e1v2e6v5e8v3e2v1},去掉 e8 ;
取一圈{v1e1v2e6v5e7v4e5v3e2v1}去掉 e6 ; 得到另一颗生成树.
不难发现,图 的生成树不是 唯一的 .
3) 最小生成树(Minimum Spanning Tree)与算法
定义 13 设T (V , E1) 是赋权图 G (V , E ) 的一棵生 成树, T 中全部边上的权数之和为生成树的权, 称 记为
w(T ) ,即 w(T )
eE1 *
w(e) .
a) 深探法 例用深探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给u以标号0. ii) 若某点v已得标号,检 图10 查一端点为v的各边,另一 1 2 8 7 端是否均已标号. 10 11 3 若有边vw之w未标号,则给 0 9 13 12 w以标号i+1,记下边vw.令 6 5 4 w代v,重复ii). 若这样的边的另一端均已有标号,就退到标号为 i-1的r点,以r代v,重复ii),直到全部点得到标号为止.
4.最小生成树及算法
1) 树(tree)的定义与树的特征 定义 连通且不含圈的无向图称为树.常用T表示. 树中的边称为树枝. 树中度为1的顶点称为树叶. 孤立顶点称为平凡树.
v1
v2
v3
v4
v5
平凡树 注意:无向图
例如,图 6.4.1 给出的 G1 和 G2 是树,但G3 (有圈)和 G4 (不连通)则不是树。
最小生成树的Prim算法
• Prim算法思路 – 从任意一顶点开始,首先把这个顶点包括在生成树里, 然后在那些其一端已在生成树里,而另一端还未在生 成树里的边中,找权值最小的一条边,并把这条边和 其不在生成树里的那个顶点包括进生成树中。如此进 行下去,每次往生成树里加入一个顶点和一条权最小 的边,直到把所有顶点都包括进生成树里 – 理论上,当有两条具有相同最小权值的边可选择时, 选哪一条都行,因此构造的最小生成树不一定唯一。 但若给定算法,则唯一
(n ) (V , ET ) 有 n 1条边且无圈, 由定理 2 知,
这是一棵树,且为图 G 的一棵生成树.
一般来讲,一个图的生成树不唯一。例如,在 图6.4.2 中,(a)、(b)、(c) 均是 (d) 的生成树。
(a)
(b)
(c) 图 6.4.2
(d)
(II)找图中生成树的方法
可分为两种:避圈法和破圈法 A 避圈法 : 深探法和广探法 B 破圈法
b)广探法 例用广探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给u以标号0. ii) 令所有标号i的点集为 Vi,检查[Vi,V\Vi]中的边端点 是否均已标号. 对所有未标 号之点均标以i+1,记下这些 边. iii) 对标号i+1的点重复步 步骤ii),直到全部点得到 标号为止.
A 避圈法 定理3的充分性的证明提供了一种构造图的生 成树的方法. 这种方法就是在已给的图G中,每步选出一 条边使它与已选边不构成圈,直到选够n-1条边为 止. 这种方法可称为“避圈法”或“加边法” 在避圈法中,按照边的选法不同,找图中生 成树的方法可分为两种:深探法和广探法.
a) 深探法 例用深探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给以标号0. 令i=0 ii) 若某点v已得标号,检 图10 1 2 查一端点为v的各边,另一 8 7 端是否均已标号. 10 11 0 3 若有边vw之w未标号,则给 9 13 12 6 w以标号i+1,记下边vw.令 5 4 w代v,重复ii). 若这样的边的另一端均已有标号,就退到标号为 i-1的r点,以r代v,重复ii),直到全部点得到标号为止.
4
11 16 41 53 69
结果显示于
图
• 最小生成树的 Kruskal 算法是 1956 年由Kruskal 提 出的。随后在 1957 年,领导贝尔实验室数学研究 室的 Prim 创立了他的算法。
令m表示边数
Kruskal 算法的时间复杂性以 O(mlog2m) 为界,当 边数较多或是一个完全图时,m (n 1)2,则时间复杂 性近似于 O(n2log2n)。而 Prim 算法的时间复杂性为 O(n2),所以,如果图的连通度较高(最高为完全图), 以 Prim 算法较好,如果图的连通度较低,特别当 m O(n) 时,则 Kruskal 算法更合适。
在实际应用中,还会遇到求一个赋权图的最大生 成树的问题。比如,某图的边权代表的是利润或效益, 则最终的问题很可能就是求其最大生成树。事实上, 从上面两个算法可以看出,只要边权的选择改为从大 到小,求最小生成树的算就可以用来求最大生成树了。
B破圈法
例11用破圈法求下图的最小树.
算法2 步骤如下: 1) 从图G中任选一棵树T1. 2) 加上一条弦e1,T1+e1中 立即生成一个圈. 去掉此 圈中最大权边,得到新 树T2,以T2代T1,重复2)再 检查剩余的弦,直到全 部弦检查完毕为止. 再加上弦e7,得到圈 v4v5v2v4, 先求出上图的一棵生成树. 加以弦 e2,得到的圈v1v3v2v1, 去掉最大的权边e6,得到一棵 新树;如此重复进行,直到全 去掉最大的权边e2,得到一棵新 树仍是原来的树; 全部的弦均已试过,得最小树.
(a,e) (c,e) (c,d) (d,g) (d, f)
{a, b}
{a, b, e} {a, b, e, c} {a, b, e, c, d} {a, b, e, c, d, g} {a, b, e, c, d, g, f}
{(a, b)}
{(a, b), (a, e)} {(a, b), (a, e), (c, e)} {(a, b), (a, e), (c, e), (c, d)} {(a, b), (a, e), (c, e), (c, d), (d, g)} {(a, b), (a, e), (c, e), (c, d), (d, g), (d, f)}
Kruskal算法步骤
(1) 对属于E的边进行排序得 e1 e2 e (2) 初始化操作 0, T , k 0, t 0
(3)若t=n-1,则转(6),否则转(4)
4 (4)若 T {e k }构成一回路,则做k k 1, 转( )
(6)输出T,w,停止
G1
G2
G3
G4
图 6.4.1
定理2 设G是具有n个顶点的图,则下述命题等价:
1) G是树( G无圈且连通);
2) G无圈,且有n-1条边; 3) G连通,且有n-1条边; 4) G无圈,但添加任一条新边恰好产生一个圈; 5) G连通,且删去一条边就不连通了(即G为最 最小连通图); 6) G中任意两顶点间有唯一一条路.
(5)T T {e k }, k,t t 1, k k 1, 转( ) 3
例10用Kruskal算法求下图的最小树.
在左图中 {e1, e2 ,..., e8}权值 最小的边有 e1, e5 , 任取一条e1, 在 {e2 , e3 ,..., e8} 中选取权值 最小的边 e5 , {e2 , e3 , e4 , e6 , e7 , e8} : 中权值最小边有 e3 ,e7, 从中选 任取一条边 e3 ; {e2 , e4 , e6 , e7 , e8} 中选取在中选取 e7 , 在{e2 , e4 , e6 , e8}中选取 e4 ,e8 . 但 e4与 e8都 会与已选边构成圈,故停止,得