最小生成树实验报告
最小生成树 实验报告

最小生成树实验报告最小生成树实验报告一、引言最小生成树是图论中的一个重要概念,它在实际问题中有着广泛的应用。
本次实验旨在通过编程实现最小生成树算法,并通过实验数据对算法进行分析和评估。
二、算法介绍最小生成树算法的目标是在给定的带权无向图中找到一棵生成树,使得树上所有边的权重之和最小。
本次实验我们选择了两种经典的最小生成树算法: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)将图中的边按权重从小到大进行排序。
最小生成树 实验报告

最小生成树(Minimum Spanning Tree)实验报告1. 实验目的本实验旨在通过实践掌握最小生成树算法的基本原理和实现方法。
最小生成树是图论中的一个重要概念,用于解决具有权重的连通图的最优路径问题。
通过本实验,我们将学习如何使用最小生成树算法找到一棵连接图的所有节点且总权重最小的树。
2. 实验原理最小生成树是一个连通图的一种生成树,它的所有边的权重之和最小。
最小生成树的求解算法有多种,其中两种常用的算法是 Prim 算法和 Kruskal 算法。
2.1 Prim 算法Prim 算法是一种贪心算法,从一个节点开始,逐步扩展最小生成树的边。
具体步骤如下: 1. 选择一个起始节点作为最小生成树的根节点。
2. 在当前最小生成树的所有节点中选择一个与该树相连接的权重最小的边,将其加入最小生成树。
3. 将该节点标记为已访问。
4. 重复步骤 2 和步骤 3,直到所有节点都被访问。
2.2 Kruskal 算法Kruskal 算法也是一种贪心算法,通过不断选择权重最小的边来构建最小生成树。
具体步骤如下: 1. 对所有边按照权重进行排序。
2. 依次选择权重最小的边,如果该边的两个端点不在同一个连通分量中,则将该边加入最小生成树,并将这两个端点合并到同一个连通分量中。
3. 重复步骤 2,直到所有节点都在同一个连通分量中,即最小生成树构建完成。
3. 实验步骤本实验将使用 Prim 算法和 Kruskal 算法分别求解给定图的最小生成树。
3.1 数据准备首先,我们需要准备一个具有权重的连通图作为实验数据。
假设该图有 n 个节点和 m 条边,我们可以使用邻接矩阵或邻接表来表示这个图。
3.2 Prim 算法求解最小生成树1.首先,选择一个起始节点作为最小生成树的根节点,并将该节点标记为已访问。
2.初始化一个空的最小生成树,用于存储最终的结果。
3.重复以下步骤,直到所有节点都被访问:1.在当前最小生成树的所有节点中选择一个与该树相连接的权重最小的边,将其加入最小生成树。
求最小生成树(Kruskal算法)实验报告

求最小生成树(Kruskal算法)实验报告一、实验目的通过本次实验,掌握Kruskal算法的基本原理,能够使用该算法求解最小生成树问题,并能够进行实际应用。
同时,为学习算法的设计和分析打下基础。
二、实验内容1. 理解Kruskal算法的基本原理。
2. 实现Kruskal算法,并将其应用于求解最小生成树问题。
3. 设计实验测试用例,验证程序正确性并进行性能分析。
三、实验原理Kruskal算法是最小生成树问题的一种解决方法。
该算法基于贪心策略,通过不断选择最短的边来构造最小生成树。
实现步骤如下:1. 将所有边按权重从小到大进行排序。
2. 遍历所有边,每次选择一条没有出现在生成树中的最短边,并将该边所连接的两个顶点合并到同一连通分量中。
3. 直到所有的边都被遍历过,即可得到最小生成树。
四、实验设计本次实验的主要任务是实现Kruskal算法,并运用到最小生成树问题中。
为了测试算法的正确性和性能,需要设计适当的测试用例。
具体的实验步骤如下:1. 设计数据结构在Kruskal算法中,需要维护边的信息,并对边进行排序,同时需要维护顶点的信息。
为方便实现,可以使用C++语言的STL库中的vector和set数据结构。
vector用于存储顶点信息,set用于存储排序后的边信息。
其中,顶点包含顶点编号和连通分量编号,边包含起点、终点和边权重。
为了方便生成测试数据,定义两个常量:MAX_VERTEX和MAX_EDGE。
MAX_VERTEX表示最大顶点数量,MAX_EDGE表示最大边数量。
2. 生成测试数据为了测试算法的正确性和性能,需要生成不同大小的测试数据。
可以随机生成若干个顶点和相应的边,其中顶点编号从1开始连续编号,边的起点和终点使用随机数生成,边的权重也使用随机数生成。
3. 实现Kruskal算法根据算法原理,可以实现基本的Kruskal算法。
具体实现过程如下:1. 首先将所有的边按照权重从小到大排序,并分别初始化每个顶点的连通分量编号。
Prim最小生成树 实验报告含源码

实验报告题目说明:POJ2395 Out of Ray题目大意:Beth有m个农场,农场之间有些相通,有些不通。
已知,Beth每一英里要一盎司的水,Beth希望走遍所有的农场但携带最少的水。
问:Beth最多需要带多少水?(每个农场都可以补充水)本程序利用Prim算法俩实现题目要求。
1.<创建>输入农场数和农场之间的距离(均为整数),程序给出连通判断。
2.修改路径按格式输入修改值,此时路线可能会改变。
3.<输出最大携带水量>,附上最小生成树实验说明:1.基本思想利用邻接表G [ ][ ] 储存农场信息,然后使用Prim算法来完成最小生成树的构建;最后寻找出最大边,如果农场是不连通的将给出提示,可以对路径修改。
2.函数模块(1)int InitiTable(int G[][MaxFarm],int num);//创建邻接表,返回值是农场数目{int j,k,TempValue;while(true){cout<<"请输入农场的数目:"<<' ';cin>>num;if(num<=MaxFarm&&num>0)break;cout<<"错误!请重新输入."<<endl<<endl;}for(j=0;j<num;j++){for(k=0;k<num;k++){if(j==k)G[j][k]=MaxWeight;else if(j<k){while(true){cout<<"请输入农场"<<j+1<<"至农场"<<k+1<<"的距离。
如果该路不存在请输入-1:"<<endl;cin>>TempValue;if(TempValue>=-1&&TempValue<MaxWeight) break;cout<<"输入无效,请重新输入。
最小生成树算法实验报告

最小生成树算法实验报告【实验报告】最小生成树算法实验一、实验目的本次实验旨在研究最小生成树算法,通过对比不同的算法,并对实验结果进行分析,探索最小生成树算法的优劣势和适应场景。
二、实验过程1.算法介绍本次实验中我们将使用两种最小生成树算法:普里姆算法和克鲁斯卡尔算法。
- 普里姆算法(Prim算法):从一个顶点开始,不断在剩下的顶点中选择到当前已有的最小生成树的距离最小的边,将该边的另一个顶点加入树中,直到所有的顶点都加入树中。
- 克鲁斯卡尔算法(Kruskal算法):首先将所有边按照权值从小到大进行排序,然后以最小权值的边开始,依次选择权值最小且不会形成环路的边,直到找到n-1条边为止,其中n为顶点数。
2.实验步骤首先,我们使用Python语言实现了普里姆算法和克鲁斯卡尔算法。
然后,我们构造了一些测试用例,包括不同规模的图和不同权值分布的图。
最后,我们对实验结果进行对比分析。
三、实验结果1.测试用例设计我们设计了三个测试用例,分别为小规模图、中规模图和大规模图,具体如下:-小规模图:顶点数为5的图,权值随机分布。
-中规模图:顶点数为50的图,权值随机分布。
-大规模图:顶点数为100的图,权值随机分布。
2.实验结果分析我们的实验结果如下表所示:算法,小规模图,中规模图,大规模图:-------:,:------:,:------:,:------:普里姆算法,13,455,703从实验结果可以看出,对于小规模图和中规模图,普里姆算法的运行时间明显低于克鲁斯卡尔算法。
但是对于大规模图,克鲁斯卡尔算法的运行时间与普里姆算法的运行时间差距不大,甚至略小于普里姆算法。
这是因为克鲁斯卡尔算法中排序边的时间复杂度为O(ElogE),而普里姆算法中筛选最小距离的边的时间复杂度为O(V^2)。
综上所述,普里姆算法适用于较小规模的图,而克鲁斯卡尔算法适用于较大规模的图。
四、实验总结本次实验研究了最小生成树算法,通过对比实验结果,我们发现不同算法在不同规模的图上的表现有所差异。
最小生成树算法实验报告

最小生成树算法问题描述设G=(V,E)是一个无向连通带权图,E中每条边(v,w)的权为c(v,w)。
如果G 的一个子图G'是一棵包含G的所有顶点的书,则称G'为G的生成树。
生成树上各边权的总和称为该生成树的耗费,在G的所有生成树中,耗费最小的生成树就称为G的最小生成树。
给定一个无向连通带权图,构造一个最小生成树。
设计思想利用Prim 算法求最小生成树,Prim 算法是利用贪心策略设计的算法。
设G=(V,E)是一个连通带权图,V={1, 2,…,n}。
构造G的一棵最小生成树的Prim算法的基本思想是:首先置U={1},然后,只要U是V的真子集,就做如下的贪心选择:选取满足条件i € U,j € V-U,且使c(i,j)达到最小的边(i,j), 并将顶点j添加到U中。
这个过程一致进行到U=V时为止。
在这个过程中选取到的所有边恰好构成G的一棵最小生成树。
时间复杂度Prim 算法的Pascal 语言描述如下:Procedure PRIM(c:array[1..n,1..n] of real);Varlowcost:array[1..n] of real; closest:array[1..n] of integer;i,j,k,min,integer; begin(I)for i:=2 to n do⑵begin{初始化,此时U只含有顶点1}(3)lowcost[i]:=c[1,i];(4)Closest[i]:=1;(5)end;(6)for i:=2 to n do(7)begin {寻找顶点分别在V-U与U中边权最小的边}(8)min:=lowcost[i];(9)j:=i;(10)For k:=2 to n do(II)If lowcost[k]<min then(12)Begin(13)Min:=lowcost[k];(14)j:=k;(15)End;(16)print(j,closest[j]);{ 输出找到的边}(17)Lowcost[j]:= %;{将j 添加到U}(18)For k:=2 to n do { 调整lowcost 和closest}(19)if(c[j,k]<lowcost[k])and(lowcost[k]< %)then(20)Begin(21)Lowcost[k]:=c[j,k];(22)Closest[k]:=j;(23)End(24)End(25)End;{PRIM}上述过程中第(6)~(24) 行的for 循环要执行n-1 次,每次执行时,第(10)~(15)行和第(18)~(23)行的for循环都要0(n)时间,所以Prim算法所需的计算时间为O(n2 )。
实验八 图的最小生成树

浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验八图的最小生成树实验成绩指导老师(签名)日期1.一.实验目的和要求2.掌握图的最小生成树的概念。
3.掌握生成最小生成树的Prim算法(用邻接矩阵表示图)。
1、二.实验内容2、编写用邻接矩阵表示无向带权图时图的基本操作的实现函数, 主要包括:①初始化邻接矩阵表示的无向带权图 void InitMatrix(adjmatrix G); ②建立邻接矩阵表示的无向带权图 void CreateMatrix(adjmatrix G, int n) (即通过输入图的每条边建立图的邻接矩阵); ③输出邻接矩阵表示的无向带权图void PrintMatrix(adjmatrix G, int n) (即输出图的每条边)。
把邻接矩阵的结构定义以及这些基本操作实现函数存放在头文件Graph1.h 中。
3、编写生成最小生成树的Prim算法函数void Prim(adjmatrix G, edgset CT,int n)以及输出边集数组的函数void PrintEdge(edgeset CT, int n)。
编写测试程序(即主函数), 通过调用上述函数首先建立并输出无向带权图, 然后生成最小生成树并输出(即输出边集)。
要求: 把边集数组的结构定义、Prim算法函数、输出边集数组的函数PrintEdge 以及主函数存放在文件test8.cpp中。
测试数据如下:填写实验报告, 实验报告文件取名为report8.doc。
5.上传实验报告文件report8.doc与源程序文件test8.cpp及Graph1.h到Ftp服务器上自己的文件夹下。
三.函数的功能说明及算法思路函数: void InitMatrix(adjmatrix GA)功能: 初始化邻接矩阵表示的无向带权图函数: void CreateMatrix(adjmatrix GA,int n)功能: 建立邻接矩阵表示的无向带权图函数: void PrintMatrix(adjmatrix GA,int n)功能: 输出邻接矩阵表示的无向带权图函数: void Prim(adjmatrix GA,edgeset CT,int n)功能: 生成最小生成树思路:设从连通带权图G = { V, E }中的某一顶点u0 出发;选择与它关联的具有最小权值的边<u0, v>, 将其顶点加入到生成树的顶点集合U中;以后每一步从一个顶点在U中, 而另一个顶点在V-U中的各条边中选择权值最小的边<u, v>,把该顶点加入到集合U中;如此继续下去, 直到图中的所有顶点都加入到生成树顶点集合U中为止。
最小生成树实验报告

最小生成树实验报告最小生成树实验报告引言:最小生成树是图论中一个重要的概念,它在许多实际问题中都有广泛的应用。
本次实验旨在通过实际操作,深入理解最小生成树的概念、算法及其在实际问题中的应用。
本文将从实验的目的、实验过程、实验结果及分析等方面进行详细的论述。
实验目的:1. 理解最小生成树的概念及其在实际问题中的应用;2. 掌握最小生成树的两种常用算法:Prim算法和Kruskal算法;3. 通过实际操作,加深对最小生成树算法的理解。
实验过程:1. 实验环境的搭建:首先,我们需要在计算机上搭建一个图论实验环境。
选择一门编程语言,如Python,来实现最小生成树算法。
通过安装相应的开发环境和图论库,我们可以方便地进行实验。
2. 数据的准备:为了进行最小生成树的实验,我们需要准备一组具有权值的图数据。
可以通过手动输入或从文件中读取的方式获取数据。
确保数据的合理性和完整性,以便进行后续的实验操作。
3. Prim算法的实现:Prim算法是一种贪心算法,用于求解最小生成树。
在实验中,我们需要实现Prim算法,并将其应用于准备好的图数据上。
通过编程实现,我们可以得到Prim算法生成的最小生成树。
4. Kruskal算法的实现:Kruskal算法是另一种常用的最小生成树算法。
与Prim算法不同,Kruskal算法是一种基于边的贪心算法。
同样地,我们需要实现Kruskal算法,并将其应用于准备好的图数据上,以获得Kruskal算法生成的最小生成树。
实验结果与分析:通过实验,我们得到了Prim算法和Kruskal算法生成的最小生成树。
我们可以将这两个结果进行对比和分析,以进一步理解这两种算法的特点和应用场景。
首先,我们可以比较两个算法生成的最小生成树的权值。
通过计算权值的总和,我们可以确定哪个算法生成的最小生成树更优。
此外,我们还可以比较两个算法生成的最小生成树的结构,观察它们是否存在差异。
其次,我们可以分析两个算法的时间复杂度和空间复杂度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告题目:最小生成树问题院(系):计算机工程学院学生姓名:班级:学号:起迄日期:指导教师:2011—2012年度第 2 学期一、需求分析1.问题描述:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
存储结构采用多种。
求解算法多种。
2.基本功能在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。
程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。
3.输入输出以文本形式输出最小生成树,同时输出它们的权值。
通过人机对话方式即用户通过自行选择命令来输入数据和生成相应的数据结果。
二、概要设计1.设计思路:因为是最小生成树问题,所以采用了课本上介绍过的克鲁斯卡尔算法和 prim算法两种方法来生成最小生成树。
根据要求,需采用多种存储结构,所以我选择采用了邻接表和邻接矩阵两种存储结构。
2.数据结构设计:图状结构:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR}VR={<v,w>|v,w∈V且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义或信息}基本操作:CreateGraph( &G, V, VR )初始条件:V是图的顶点集,VR是图中弧的集合。
操作结果:按V和VR的定义构造图G。
DestroyGraph( &G )初始条件:图G存在。
操作结果:销毁图G。
LocateVex( G, u )初始条件:图G存在,u和G中顶点有相同特征。
操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其它信息。
GetVex( G, v )初始条件:图G存在,v是G中某个顶点。
操作结果:返回v的值。
PutVex( &G, v, value )初始条件:图G存在,v是G中某个顶点。
操作结果:对v赋值value。
FirstAdjVex( G, v )初始条件:图G存在,v是G中某个顶点。
操作结果:返回v的第一个邻接顶点。
若顶点在G中没有邻接顶点,则返回“空”。
NextAdjVex( G, v, w )初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。
操作结果:返回v的(相对于w的)下一个邻接顶点。
若w是v的最后一个邻接点,则返回“空”。
InsertVex( &G, v )初始条件:图G存在,v和图中顶点有相同特征。
操作结果:在图G中增添新顶点v。
DeleteVex( &G, v )初始条件:图G存在,v是G中某个顶点。
操作结果:删除G中顶点v及其相关的弧。
InsertArc( &G, v, w )初始条件:图G存在,v和w是G中两个顶点。
操作结果:在G中增添弧<v,w>,若G是无向的,则还增添对称弧 <v,w>。
DeleteArc( &G, v, w )初始条件:图G存在,v和w是G中两个顶点。
操作结果:在G中删除弧<v,w>,若G是无向的,则还删除对称弧 <v,w>。
DFSTraverse( G, Visit() )初始条件:图G存在,Visit是顶点的应用函数。
操作结果:对图进行深度优先遍历。
在遍历过程中对每个顶点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
BFSTraverse( G, Visit() )初始条件:图G存在,Visit是顶点的应用函数。
操作结果:对图进行广度优先遍历。
在遍历过程中对每个顶点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
}ADT Graph存储结构:邻接矩阵:#define INFINITY INT_MAX//最大值无穷#define MAX_VERTEX_NUM 20//最大顶点个数typedef enum{UDN} GraphKind;typedef struct ArcCell{VRType adj;//VRType是顶点关系类型//对带权图为权值类型InfoTyep *info;//该弧相关信息的指针}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{VertexType vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs;//邻接矩阵int vexnum,arcnum;//图的当前顶点数和弧数GraphKind kind;}MGraph;三、详细设计1.数据类型的定义<1>图类型#define M 20#define MAX 20#define null 0#define MAX_VERTEX_NUM 20// 最大顶点个数#define MAX_NAME 3 // 顶点字符串的最大长度+1#define MAX_INFO 20 // 相关信息字符串的最大长度+1#define INFINITY INT_MAX// 用整型最大值代替∞typedef int VRType;typedef char InfoType;typedef char VertexType[MAX_NAME];// 邻接矩阵的数据结构typedef struct{VRType adj; // 顶点关系类型。
对无权图,用1(是)或0(否)表示相邻否;// 对带权图,则为权值类型InfoType *info; // 该弧相关信息的指针(可无)}ArcCell, adjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];// 图的数据结构typedef struct{VertexType vexs[MAX_VERTEX_NUM];// 顶点向量adjMatrix arcs;// 邻接矩阵int vexnum,// 图的当前顶点数arcnum;// 图的当前弧数} mGraph;// 记录从顶点集U到V-U的代价最小的边的辅助数组定义 typedef struct{VertexType adjvex;VRType lowcost;}minside[MAX_VERTEX_NUM];2.主要模块的算法描述<1>主函数int main(void) //主函数{int i;scanf("%d",&i);switch(i) /*选择菜单*/{case 1:{ 用prim算法求最小生成树}break;case 2:{ 用kruskal算法求最小生成树}break;default:printf("\t\t输入错误!请重新输入!\n");}}<2>使用prim算法生成最小生成树{定义图的数据结构;图的构建;{/*prim算法求最小生成树*/对I,j,k定义;记录从顶点集U到V-U的代价最小的边的辅助数组定义;把顶点信息的赋给k;辅助数组初始化;令最小代价初始化为0,closedge[k].lowcost=0; // 初始,U={u};满足当循环变量i小于图的当前节点数时循环;{按照选取最小代价法则(即求closedge.lowcost的最小正值)选取当前节点的下一结点(第k顶点);输出生成树的边;将第k顶点并入U集合;满足循环变量j小于图的当前点数时循环;{新顶点并入U集后重新选择最小边;}}}}<3>使用克鲁斯卡尔算法生成最小生成树{图的构建并初始化{定义图的数据结构;申请节点空间(如果失败则返回信息);创建图;/*kruskal算法求最小生成树*/{对i,j,n,m, parent[M],edge edges[M]定义或初始化;满足当循环变量i小于图的当前节点数时循环;{满足循环变量j=i+1小于图的当前点数时循环;{if(第i个顶点于第j个顶点相连){ 把i赋给edges[k].begin;把j赋给edges[k].end;把i,j之间的权值赋给edges[k].weight;K++;}/*对结构体edge进行初始化*/}}对图G边的权值进行排序sort(edges, G);当循环变量i小于当前弧度数时{将0赋给parent[i],初始化数组;}当循环变量i小于当前弧度数时(此时第i条弧为最小的){找第i条弧的起点和终点;并分别赋给你n,m;当n,m不相等时{把m赋给parent[n];输出此时第i条弧的起点、终点、权值;}}}流程图:四、调试分析本次课程设计基本达到了设计需求。
但是还有很多不足。
比如不能随意切换两种算法,也不能由用户选择使用邻接矩阵还是邻接表,以后更加深入的学习计算机知识或许可以在这两个方面进行改进。
五、测试结果prim算法正确结果:prim算法错误结果:克鲁斯卡尔算法正确结果:克鲁斯卡尔算法错误结果:六、体会与自我评价“数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其他理工专业的热门选修课。
本学期通过学习这门课程,我学会了分析研究计算机加工的数据结构的特性,以及算法的事件分析和空间分析。
这些帮助我在设计程序的过程中,更好为数据选择适当的逻辑结构、存储结构及其相应的算法。
通常情况下,交通、道路问题的数学模型是一种称为“图”的数据结构。
在本课题中,每个顶点代表一个城市,每一条边代表一条通信录井,同时给每条路径赋予权值,代表着这条路径的建设代价。
通过最小生成树的实现,可以实现以最节省经费的方式来建立这个通信网。
对于n个顶点的联通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。
但是根据要求,我们需要以最少的经费来完成整个通信网的建设,于是便有了最小生成树问题。
为了完成本次课程设计,因为课本上只有prim算法的代码,所以克鲁斯卡尔算法还需要自己使用百度进行查找。
在查找到算法之后,要将其变为程序源代码,将它们的功能实现出来。
这就需要用到计算机高级语言编程了。
我们所学的是C语言版的数据结构,C语言的课程是在大一下半学期就完成的,所以总体来说难度并不是很大。
再加上题目要求也不多,属于很简单的题目,所以基本上没有碰到大的难题。
通过本次设计,我对C语言有了更深一层的认识,同时也更好的掌握了“图”部分的算法及其实现方法。
这让我对数据结构这门课程都有了更深层次的体会。
进行课程设计的确会对本课程的学习有很大的帮助。