Prim算法最小生成树(C语言)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最小生成树
一目的
给定一个地区的n个城市间的距离网,用Prim算法建立最小生成树,并计算得到的最小生成树的代价。
二需求分析
(1)城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价;
(2)表示城市间距离网的邻接矩阵(要求至少6个城市,10条边);并且利用文件对数据进行提取。
(3)输出最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。
(4)采用模块化设计;
三概要设计
1、相关定义以及算法概述
(1)最小生成树的定义:假设一个单位要在n个办公地点之间建立通信网,则连通n个地点只需要n-1条线路。可以用连通的无向网来表示n个地点以及它们之间可能设置的通信线路,其中网的顶点表示城市,边表示两地间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以表示一个通信网。其中一棵使总的耗费最少,即边的权值之和最小的生成树,称为最小生成树。
(2)普里姆(Prim)算法即是利用MST性质构造最小生成树的算法。算法思想如下:假设N=(V,{E})和是连通网,TE是N上最小生成树中边的集合。算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U 的边(u, v) ∈E中找一条代价最小的边(u0, v0)并入集合TE,同时v0并入U,直到U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。
2、函数设计
四详细设计
1、mian函数
mian函数是一个程序的入口和出口,在我的课程设计中,输入城市和城市间的路径以及各条路径的信息生成所输入信息的邻接矩阵是在主函数实现。
如果两城市为同一城市或者两城市之间无通路路径,则在邻接矩阵中用整形最大值MAXCOST (0x7fffffff)表示。
例如:
流程:
①初始化所有路径为无穷大
②获取城市和城市间通路路径的数目
③获取边信息
④将边信息对称存储在二维数组里,则形成邻接矩阵
⑤求解最小生成树(调用Prim函数)
⑥输出最小权值和
2、Prim函数
Prim函数的功能用于Prim算法的实现,也就是求解最小树并返回该最小生成树的总代价。
在函数中:
数组BianQuan记录以i为终点的边的最小权值,当BianQuan[i]=0时表示终点i加入生成树
数组QiDian记录对应BianQuan[i]的起点,当QiDian[i]=0时表示起点i 加入生成树。
流程:
①默认选择1号节点加入生成树,找出与它的所有通路,更新相应数组。
②找出最小边权的路径进行输出,更新相应数组。
③把步骤②输出的路径的终点作为新的起点,找到他所有通路(不包括已经加入生成树的结点),更新相应数组。
④同步骤②
⑤跳转到步骤②,直到所有结点都加入生成树。
⑥返回代价,结束。
五调试分析
起初在编写程序时,没考虑城市与城市之间无通路的情况,导致当程序输入数据中每个城市都对每个城市有通路时运行正常,而当输入数据某个城市对某个城市之间无通路时运行错误,通过请教其他同学,我发现了这个问题,并通过在建立邻接矩阵时初始化所有路径为最大值解决了它。
六测试结果
假设有一城市分布图如下图
输入数据:
7 11
A B 7
A D 5
B C 8
B D 9
B E 7
C E 5
D E 15
D F 6
E F 8
E G 9
F G 11
输出:
A - D : 5
D - F : 6
A -
B : 7
B - E : 7
E - C : 5
E - G : 9
Total:39
七用户使用说明
八课程设计总结
本次课程设计实验过程中遇到了很多问题,但通过多次调试最终得到解决。并且通过本次课设,我掌握了Prim算法的实现最小生成树的方法,对我在课堂上学的知识进一步加深;另外通过编写此程序,我感受到了数据结构的重要性,作为一名程序员数据结构是必不可少的。