数据结构课程设计报告java最小生成树
最小生成树 实验报告

最小生成树实验报告最小生成树实验报告一、引言最小生成树是图论中的一个重要概念,它在实际问题中有着广泛的应用。
本次实验旨在通过编程实现最小生成树算法,并通过实验数据对算法进行分析和评估。
二、算法介绍最小生成树算法的目标是在给定的带权无向图中找到一棵生成树,使得树上所有边的权重之和最小。
本次实验我们选择了两种经典的最小生成树算法:Prim 算法和Kruskal算法。
1. Prim算法Prim算法是一种贪心算法,它从一个顶点开始,逐步扩展生成树的规模,直到包含所有顶点为止。
算法的具体步骤如下:(1)选择一个起始顶点,将其加入生成树中。
(2)从与生成树相邻的顶点中选择一个权重最小的边,将其加入生成树中。
(3)重复上述步骤,直到生成树包含所有顶点。
2. Kruskal算法Kruskal算法是一种基于并查集的贪心算法,它首先将图中的边按权重从小到大进行排序,然后逐个加入生成树中,直到生成树包含所有顶点为止。
算法的具体步骤如下:(1)将图中的边按权重从小到大进行排序。
(2)逐个加入边,如果该边的两个顶点不在同一个连通分量中,则将其加入生成树中。
(3)重复上述步骤,直到生成树包含所有顶点。
三、实验过程本次实验我们使用C++语言实现了Prim算法和Kruskal算法,并通过随机生成的图数据进行了测试。
1. Prim算法的实现我们首先使用邻接矩阵表示图的结构,然后利用优先队列来选择权重最小的边。
具体实现过程如下:(1)创建一个优先队列,用于存储生成树的候选边。
(2)选择一个起始顶点,将其加入生成树中。
(3)将与生成树相邻的顶点及其边加入优先队列。
(4)从优先队列中选择权重最小的边,将其加入生成树中,并更新优先队列。
(5)重复上述步骤,直到生成树包含所有顶点。
2. Kruskal算法的实现我们使用并查集来维护顶点之间的连通关系,通过排序后的边序列来逐个加入生成树中。
具体实现过程如下:(1)将图中的边按权重从小到大进行排序。
数据结构(Java版)图2(最小生成树)

最小生成树举例
A
50 60 52 65 50
C
45 42 30 50
A
C
45
B
40
D
G
B
40 50
D
42 30
G
E
70
F
E
F
(a) 无向带权连通图G
(b) 无向带权图G 的最小生成树T
从最小生成树的定义可知,构造n个顶点的无向带权连 通图的最小生成树,必须满足如下三个条件: ① 必须包含n个顶点。 ② 有且仅有n-1条边。 ③ 没有回路。
)
将ej边加入到tree中;
}
实践项目
设计一个程序实现Prim和Kruskal算法.
表5-1 lowcost[ ]数组数据变化情况 表5-2 closest[ ]数组数据变化情况
扫描次数
closest[0]
closest[1]
closest[2]
closest[3]
closest[4]
closest[5]
求最小生成树算法
普里姆算法(Prim) (从点着手)
适合于求边稠密的最小生成树 适合于求边稀疏的最小生成树
克鲁斯卡尔算法(Kruskal)(从边着手)
普里姆算法(Prim)思想
1.
2.
3.
4.
令集合U={u0}(即从顶点u0开始构造最小生 成树),集合T={}。 从所有顶点u∈U和顶点v∈V-U的边权中选择最 小权值的边(u,v),将顶点v加入到集合U中,边 (u,v)加入到集合T中。 如此重复下去,直到U=V时则最小生成树构造完 毕。 此时集合U就是最小生成树的顶点集合,集合T 就是最小生成树的边集。
数据结构课程设计实践报告

数据结构实验报告实验名称:结构图提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:结构图一、实验目的和要求1、设计目的1.掌握图的相关概念,包括图,有向图,无向图,完全图,子图,连通图,度,入度,出度,简单回路和环等定义。
2.重点掌握图的各种存储结构,包括邻接矩阵和邻接表等。
3.重点掌握图的基本运算,包括创建图,输出图,深度优先遍历,广度优先遍历等。
4.掌握图的其他运算,包括最小生成树,最短路径,拓扑排序和关键路径等算法。
5. 灵活运用图这种数据结构解决一些综合应用问题。
2、设计内容和要求1、编写一个程序algo8-1.cpp,实现不带权图和带权图的邻接矩阵与邻接表的相互转换算法、输出邻接矩阵与邻接表的算法,并在此基础上设计一个程序exp8-1.cpp实现如下功能:①建立如图1所示的有向图G的邻接矩阵,并输出;②由有向图G的邻接矩阵产生邻接表,并输出;③再由②的邻接表产生对应的邻接矩阵,并输出。
图12、编写一个程序algo8-2.cpp,实现图的遍历运算,并在此基础上设计一个程序exp8-2.cpp完成如下功能:①输出图1所示的有向图G从顶点0开始的深度优先遍历序列(递归算法);②输出图1所示的有向图G从顶点0开始的深度优先遍历序列(非递归算法);③输出图1所示的有向图G从顶点0开始的广度优先遍历序列。
3、设计一个程序exp8-3.cpp,采用邻接表存储图,并输出图8.1(a)中从指定顶点1出发的所有深度优先遍历序列。
二、运行环境(软、硬件环境)软件环境:Visual C++6.0运行平台: Win32硬件:普通个人pc机三、实验过程描述文件graph.h中定义了图的邻接矩阵表示类型和邻接表表示类型,该头文件在以下三个实验中都会使用到。
其代码如下:#ifndef GRAPH_H_INCLUDED#define GRAPH_H_INCLUDEDtypedef int InfoType;#define MAXV 100 //最大顶点个数#define INF 32767 //INF表示无限大//以下定义邻接矩阵类型typedef struct{int no;InfoType info;}VertexType;typedef struct{int edges[MAXV][MAXV];int n,e;VertexType vexs[MAXV];}MGraph;//以下定义邻接表类型typedef struct ANode{int adjvex;struct ANode* nextarc;InfoType info;}ArcNode;typedef int Vertex;typedef struct VNode{Vertex data;ArcNode* firstarc;}VNode;typedef VNode AdjList[MAXV];typedef struct{AdjList adjlist;int n,e;}ALGraph;#endif // GRAPH_H_INCLUDED实验①源程序。
数据结构实验报告

数据结构实验报告一、实验目的本实验旨在通过对数据结构的学习和实践,掌握基本的数据结构概念、原理及其应用,培养学生的问题分析与解决能力,提升编程实践能力。
二、实验背景数据结构是计算机科学中的重要基础,它研究数据的存储方式和组织形式,以及数据之间的关系和操作方法。
在软件开发过程中,合理选用和使用数据结构,能够提高算法效率,优化内存利用,提升软件系统的性能和稳定性。
三、实验内容本次实验主要涉及以下几个方面的内容:1.线性表的基本操作:包括线性表的创建、插入、删除、查找、修改等操作。
通过编程实现不同线性表的操作,掌握它们的原理和实现方法。
2.栈和队列的应用:栈和队列是常用的数据结构,通过实现栈和队列的基本操作,学会如何解决实际问题。
例如,利用栈实现括号匹配,利用队列实现银行排队等。
3.递归和回溯算法:递归和回溯是解决很多求解问题的常用方法。
通过编程实现递归和回溯算法,理解它们的思想和应用场景。
4.树和二叉树的遍历:学习树和二叉树的遍历方法,包括前序、中序和后序遍历。
通过编程实现这些遍历算法,加深对树结构的理解。
5.图的基本算法:学习图的基本存储结构和算法,包括图的遍历、最短路径、最小生成树等。
通过编程实现这些算法,掌握图的基本操作和应用。
四、实验过程1.具体实验内容安排:根据实验要求,准备好所需的编程环境和工具。
根据实验要求逐步完成实验任务,注意记录并整理实验过程中遇到的问题和解决方法。
2.实验数据采集和处理:对于每个实验任务,根据要求采集并整理测试数据,进行相应的数据处理和分析。
记录实验过程中的数据和结果。
3.实验结果展示和分析:将实验结果进行适当的展示,例如表格、图形等形式,分析实验结果的特点和规律。
4.实验总结与反思:总结实验过程和结果,回顾实验中的收获和不足,提出改进意见和建议。
五、实验结果与分析根据实验步骤和要求完成实验任务后,得到了相应的实验结果。
对于每个实验任务,根据实验结果进行适当的分析。
最小生成树问题课程设计

最小生成树问题课程设计一、课程目标知识目标:1. 理解最小生成树的概念,掌握其定义及性质;2. 学会运用普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法求解最小生成树问题;3. 了解最小生成树在实际问题中的应用,如网络设计、电路设计等。
技能目标:1. 能够运用普里姆和克鲁斯卡尔算法解决最小生成树问题,并进行算法分析;2. 能够运用所学知识解决实际问题,具备一定的算法设计能力;3. 能够通过合作与交流,提高问题分析和解决问题的能力。
情感态度价值观目标:1. 培养学生对数据结构与算法的兴趣,激发学习热情;2. 培养学生的团队合作意识,学会倾听、尊重他人意见;3. 培养学生面对问题勇于挑战、积极进取的精神。
课程性质:本课程为计算机科学与技术专业的高年级课程,旨在帮助学生掌握图论中的最小生成树问题及其求解方法。
学生特点:学生具备一定的编程基础和图论知识,对算法有一定的了解,但可能对最小生成树问题尚不熟悉。
教学要求:结合学生特点,采用案例教学、任务驱动等方法,注重理论与实践相结合,培养学生的实际操作能力和创新思维。
通过本课程的学习,使学生能够将所学知识应用于实际问题中,提高解决复杂问题的能力。
二、教学内容1. 最小生成树概念与性质- 定义、性质及定理- 最小生成树的构建方法2. 普里姆算法- 算法原理与步骤- 算法实现与复杂度分析- 举例应用3. 克鲁斯卡尔算法- 算法原理与步骤- 算法实现与复杂度分析- 举例应用4. 最小生成树在实际问题中的应用- 网络设计- 电路设计- 其他领域应用案例5. 算法比较与优化- 普里姆与克鲁斯卡尔算法的比较- 算法优化方法及其适用场景6. 实践环节- 编程实现普里姆和克鲁斯卡尔算法- 分析并解决实际问题- 小组讨论与成果展示教学内容依据课程目标进行选择和组织,注重科学性和系统性。
参考教材相关章节,制定以下教学安排:第1周:最小生成树概念与性质第2周:普里姆算法第3周:克鲁斯卡尔算法第4周:最小生成树在实际问题中的应用第5周:算法比较与优化第6周:实践环节与总结三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过生动的语言和形象的比喻,对最小生成树的概念、性质、算法原理等基础知识进行讲解,使学生快速掌握课程内容。
《数据结构》课程设计

《数据结构》课程设计一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中基础的数据组织、管理和处理方法,培养其运用数据结构解决实际问题的能力。
课程目标如下:1. 知识目标:(1)理解基本数据结构的概念、原理和应用,如线性表、栈、队列、树、图等;(2)掌握常见算法的设计和分析方法,如排序、查找、递归、贪心、分治等;(3)了解数据结构在实际应用中的使用,如操作系统、数据库、编译器等。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,具备良好的编程实践能力;(2)掌握算法分析方法,能够评价算法优劣,进行算法优化;(3)能够运用数据结构进行问题建模,提高问题解决效率。
3. 情感态度价值观目标:(1)激发学生对计算机科学的兴趣,培养其探索精神和创新意识;(2)培养学生团队合作意识,学会与他人共同解决问题;(3)增强学生的责任感和使命感,使其认识到数据结构在信息技术发展中的重要性。
本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,为后续教学设计和评估提供依据。
课程注重理论与实践相结合,旨在提高学生的知识水平、技能素养和情感态度价值观。
二、教学内容《数据结构》教学内容依据课程目标进行选择和组织,确保科学性和系统性。
主要包括以下部分:1. 线性表:- 线性表的定义、特点和基本操作;- 顺序存储结构、链式存储结构及其应用;- 线性表的相关算法,如插入、删除、查找等。
2. 栈和队列:- 栈和队列的定义、特点及基本操作;- 栈和队列的存储结构及其应用;- 栈和队列相关算法,如进制转换、括号匹配等。
3. 树和二叉树:- 树的定义、基本术语和性质;- 二叉树的定义、性质、存储结构及遍历算法;- 线索二叉树、哈夫曼树及其应用。
4. 图:- 图的定义、基本术语和存储结构;- 图的遍历算法,如深度优先搜索、广度优先搜索;- 最短路径、最小生成树等算法。
5. 排序和查找:- 常见排序算法,如冒泡、选择、插入、快速等;- 常见查找算法,如顺序、二分、哈希等。
最小生成树

如此进行下去,每次往生成树里并入一 个顶点和一条边,直到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]);
/* 打印生成树的一条边*/
最小生成树问题

榆林学院12届课程设计《最小生成树问题》课程设计说明书学生姓名:赵佳学号:1412210112院系:信息工程学院专业:计算机科学与技术班级:计14本1指导教师:答辩时间:年月日最小生成树问题一、问题陈述最小生成树问题设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
存储结构采用多种。
求解算法多种。
二、需求分析1.在n个城市之间建设网络,只需保证连通即可。
2.求城市之间最经济的架设方法。
3.采用多种存储结构,求解算法也采用多种。
三、概要设计1、功能模块图2、功能描述(1)CreateUDG()创建一个图:通过给用户信息提示,让用户将城市信息及城市之间的联系关系和连接权值写入程序,并根据写入的数据创建成一个图。
(2)Switch()功能选择:给用户提示信息,让用户选择相应功能。
(3)Adjacency_Matrix()建立邻接矩阵:将用户输入的数据整理成邻接矩阵并显现在屏幕上。
(4)Adjacency_List()建立邻接表:将用户输入的数据整理成临接表并显现在屏幕上。
(5)MiniSpanTree_KRSL()kruskal算法:利用kruskal算法求出图的最小生成树,即:城市之间最经济的连接方案。
(6)MiniSpanTree_PRIM()PRIM算法:利用PRIM算法求出图的最小生成树,即:城市之间最经济的连接方案。
四、详细设计本次课程设计采用两种存储结构以及两种求解算法。
1、两种存储结构的存储定义如下:typedef struct Arcell{double adj;}Arcell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{char vexs[MAX_VERTEX_NUM]; //节点数组AdjMatrix arcs; //邻接矩阵int vexnum,arcnum; //图的当前节点数和弧数}MGraph;typedef struct Pnode //用于普利姆算法{ char adjvex; //节点double lowcost; //权值}Pnode,Closedge[MAX_VERTEX_NUM];//记录顶点集U到V-U的代价最小的边的辅助数组定义typedef struct Knode//用于克鲁斯卡尔算法中存储一条边及其对应的2个节点{char ch1; //节点1char ch2; //节点2double value;//权值}Knode,Dgevalue[MAX_VERTEX_NUM];2、求解算法采用Prim算法和Kruskal算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上海电力学院数据结构(JAVA)课程设计题目:____最小生成树_______学生姓名:_****___________学号:_____*******_______院系:计算机科学与技术学院专业年级: ______*****___级20**年 *月**日目录1.设计题目 (1)2.需求分析 (1)1)运行环境 (1)2)输入的形式和输入值的范围 (1)3)输出的形式描述 (1)4)功能描述 (1)5)测试数据 (1)3.概要设计 (1)1)抽象数据类型定义描述 (1).2)功能模块设计 (1)3)模块层次调用关系图 (2)4.详细设计。
实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
(2)5.调试分析。
包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。
(6)6.用户使用说明。
详细列出每一步的操作说明。
(7)7. 测试结果 (7)8.附录:程序设计源代码 (9)一、设计题目1).问题描述若要在 n 个城市之间建设通信网络,只需要架设n-1 条线路即可。
如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。
2). 基本要求以邻接多重表存储无向带权图,利用克鲁斯卡尔算法或普瑞姆算法求网的最小生成树。
二、需求分析1)运行环境软件在JDK运行,硬件支持windows系统2)输入的形式和输入值的范围自动生成顶点数据在10~20之间;各个顶点之间权值在25~50之间;通过程序改动亦可生成已知顶点权值之间的最小生成树,需将随机生成代码改为edge edge[]={new edge(0,1,16),new(0,2,18)......};将已知顶点、权值通过其函数输入再生成其所对应最小生成树。
3)输出的形式描述输出随机生成顶点个数以及各个顶点之间权值;然后输出本次生成顶点之间构成的最小生成树。
4)功能描述该程序会自动生成介于10~20个数顶点模拟各城市,再随机生成介于25~50之间数值作为权值模拟各个城市间的距离,并同时生成此次顶点、权值相对应的最小生成树,模拟各城市间的最小距离,最小生成树。
如有确定城市顶点及其权值,则可改动程序令其不再随机生成顶点权值,在程序中输入如下代码: edge edge[]={new edge(0,1,16),new(0,2,18)......}输入数组为edge数组,edge(起点,终点,权值)。
通过将随机生成代码改动就可以生成该城市对应权值的最小生成树。
5)测试数据生成数据之后检验生成顶点数值是否介于10~20之间;检验各顶点间权值大小是否介于25~50间;同时检验其自动生成最小生成树是否正确。
三、概要设计1)抽象数据类型定义描述定义排序类sort,将各个顶点按照其两顶点之间权值大小排序,从大到小排序,用到堆排序算法;定义带权值的边edge,分别存在start(起点)、end(终点)、value(权值)三个变量;定义main类,调用sort、edge类与自身函数通过Kruskal函数实现最小生成树。
2)功能模块设计主函数随机生成10~20个顶点作为城市并同时生成任意两顶点间25~50的权值作为两城市距离;在界面输出随机生成顶点个数及任意两顶点间权值;再调用sort函数对权进行排序,按照权值的大小有小到大排序;排序之后实现Kruskal 函数,通过kruskal函数生成最小生成树;最后输出所生成的最小生成树。
3)模块层次调用关系图四、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
1. 定义带权值的边及其三个变量start(起点)、end(终点)、value(权值);定义该属性为下边的根据权值排序、Kruskal实现最小生成树做下铺垫;函数实现如下:package tree;public class sort {public static void sift(edge a[], int root, int limit){int i = root;int j = i*2+1;//j为i的左孩子while (j <= limit) //沿较小值孩子节点向下筛选{if (j < limit && a[j].getValue() < a[j + 1].getValue())//数组元素比较{j++;//j为左右孩子的较小者}if (a[j].getValue() > a[i].getValue()) //若父亲节点值较大{edge e = a[i];//孩子节点中较小值上移a[i] = a[j];a[j] = e;i = j;j = i * 2 + 1;//i、j向下一层}else{break; //跳出循环}}}public static void sort(edge data[]){int length = data.length;for(int i = length/2-1; i>=0; i--)//创建最大堆{sift(data, i, length-1);}for (int j = length - 1; j > 0; j--)//每趟把最大值交换到后面字,再生成堆{edge e = data[0];data[0] = data[j];data[j] = e;sift(data, 0, j-1);}}}2. 随机生成介于10~20之间个顶点作为各个城市,并同时生成任意两顶点间权值,介于25~50之间;每n个顶点之间最多生成n*(n-1)条边;生成vertexNumber-1个row(行)和row-1个column(列)可以防止同一个顶点生成自环;函数实现如下:int vertexNumber=(int)((Math.random()+1)*10);System.out.println("随机生成"+vertexNumber+"个顶点");edge edges[]=new edge[vertexNumber*(vertexNumber-1)/2];for(int row=0, index=0; row<vertexNumber; row++){//row行、column列、index数组for(int column=0; column<row; column++){int x=(int)((Math.random()+1)*25);//random随机的edges[index] = new edge(row, column, x);System.out.println("顶点"+row+"和"+column+"之间的距离为"+x);index++;}}3. 定义排序类sort,按照堆排序函数对数组edge[]按照权值大小从小到大进行排序(参照课本299页);package tree;public class sort {public static void sift(edge a[], int root, int limit){int i = root;int j = i*2+1;//j为i的左孩子while (j <= limit) //沿较小值孩子节点向下筛选{if (j < limit && a[j].getValue() < a[j + 1].getValue())//数组元素比较{j++;//j为左右孩子的较小者}if (a[j].getValue() > a[i].getValue()) //若父亲节点值较大{edge e = a[i];//孩子节点中较小值上移a[i] = a[j];a[j] = e;i = j;j = i * 2 + 1;//i、j向下一层}else{break; //跳出循环}}}public static void sort(edge data[]){int length = data.length;for(int i = length/2-1; i>=0; i--)//创建最大堆{sift(data, i, length-1);}for (int j = length - 1; j > 0; j--)//每趟把最大值交换到后面字,再生成堆{edge e = data[0];data[0] = data[j];data[j] = e;sift(data, 0, j-1);}}}4.Kruskal方法实现最小生成树。
Kruskal方法与Prim方法都是基于最小生成树的MST性质:设G(V,E)是一个联通带权无向图,TV是顶点集合V的一个非空真子集。
若(tv,v)包含于E是一条权值最小的边,其中tv包含于TV,v包含于V-TV,则必定存在G的一棵最小生成树T,T包含边(tv,v)。
其Kruskal算法参照课本334页。
其算法如下:int a[] = new int[vertexNumber];//初始时刻,所有顶点的连通分量编号为-1,表示所有顶点都属于一个独立的连通分量for(int i = 0; i<a.length; i++){a[i] = -1;}edge result[] = new edge[vertexNumber-1];//该数组用于记录最小生成树int temp = 0;for(edge e : edges){int start = e.getStart();int end = e.getEnd();if(a[start]==a[end] && a[end]==-1){a[start] = a[end] = temp;result[temp] = e;temp++;}else if (a[start] != a[end]) {if (a[start] == -1) {a[start] = a[end];}else if (a[end] == -1) {a[end] = a[start];}else {int t = a[start];for (int i = 0; i < vertexNumber; i++) { if (a[i] == t) {a[i] = a[end];}}}result[temp] = e;temp++;}五、调试分析包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。
Sort排序类算法时间复杂度为O(log2n),Kruskal算法时间复杂度为O(1);调试过程中,Kruskal算法实现出现问题,刚开始无法实现该函数,无法生成最小生成树;经请教同学、查看资料、查看课本解决问题。