贪心算法实验(最小生成树).doc

上传人:豆**** 文档编号:28504609 上传时间:2022-07-28 格式:DOC 页数:25 大小:181.50KB
返回 下载 相关 举报
贪心算法实验(最小生成树).doc_第1页
第1页 / 共25页
贪心算法实验(最小生成树).doc_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《贪心算法实验(最小生成树).doc》由会员分享,可在线阅读,更多相关《贪心算法实验(最小生成树).doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date贪心算法实验(最小生成树)贪心算法实验(最小生成树)算法分析与设计实验报告第 一 次附加实验姓名学号班级时间12.12上午地点工训楼309 实验名称贪心算法实验(最小生成树)实验目的通过上机实验,要求掌握贪心算法的思想,利用prim算法求解最小生成树并实现。实验原理设G=(V,E)是连通带权图,V=1,2,n。构造G的最小生成树的Prim算法的基本思想是:首先置S=1

2、,然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件iS,jV-S,且cij最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生成树。实验步骤(1)用邻接矩阵表示无向图,并进行初始化,同时选择源点放在集合s中;(2)选取候选集中距离最短的顶点,把其加入终点集合中;(3)以该顶点为新考虑的中间顶点,修改候选集中个顶点距离,若经过该点后,各点到达源点距离比原来距离短,则修改距离;(4)重复以上2、3步,直到所有候选集中都被加入到终点集中。关键代码template/参数为结点个数n,和无向带权图中各结点之间的距离cN+1void Pr

3、im(int n,Type cN+1)Type lowcostN+1; /记录cjclosest的最小权值int closestN+1; /V-S中点j在中的最临接顶点bool sN+1; /标记各结点是否已经放入集合s中s1=true;/初始化si,lowcosti,closestifor(int i=2;i=n;i+)lowcosti=c1i;closesti=1;si=false;for(int i=1;in;i+)Type min=inf;int j=1;for(int k=2;k=n;k+)/找出V-S中是lowcost最小的顶点jif(lowcostkmin)&(!sk)/如果k的

4、lowcost比min小并且k结点没有被访问min=lowcostk;/更新min的值j=k;coutj closestjendl;/输出j和最邻近j的点sj=true;/将j添加到集合s中for(int k=2;k=n;k+)if(cjklowcostk)&(!sk)/s集合放进j后更新各结点的lowcost的值lowcostk=cjk;closestk=j;测试结果输入较小的有向带权图结果: 实验分析再求最小生成树的实验中,有两种算法:一种是Prim算法,一种是Kruskal算法。在两种算法中,我们可以比较Prim算法,是通过集合S中的点来更新另一个集合的点距这个已经生成的树的最短距离,而

5、Kruskal算法是每次都选择最短的边加入到生成树集合中,其实两种算法其思想是不同的,所以两种算法的时间复杂度也是不同的,Prim算法的时间复杂度是O(n2),而Kruskal算法的时间复杂度是O(nlogn),相比来讲,在时间上Kruskal更好一点。实验心得最小生成树在之前的数据结构中也是学过的,可是当时学的时候,也许是不够努力,学的模模糊糊的,也没有将Prim算法和Kruskal算法搞清楚,只是能简单的利用知识做题,却不能很清楚地讲明白这两种算法的原理差别,更别说是编程设计了,那就根本想都不要想,完全不知所措,在之前的数据结构中,很多涉及到图的实现,尤其那些代码实在是晦涩难懂,搞得我实在

6、不想学习,后来在算法课上学到的东西就有点不同了,也许是经过时间的打磨,感觉到现在的代码没有那么难懂了,也终于弄明白了两者的区别,感觉好多了。实验得分助教签名附录:完整代码(贪心法)/贪心算法 最小生成树prim算法#include#include#include#include#includeusing namespace std;#define inf 9999; /定义无限大的值const int N=6;template /模板定义void Prim(int n,Type cN+1);int main()int cN+1N+1; cout连通带权图的矩阵为:endl;for(int i=

7、1;i=N;i+) /输入邻接矩阵for(int j=1;jcij;coutPrim算法最小生成树选边次序如下:endl;clock_t start,end,over; /计算程序运行时间的算法start=clock();end=clock();over=end-start;start=clock();Prim(N,c); /调用Prim算法函数end=clock();printf(The time is %6.3f,(double)(end-start-over)/CLK_TCK); /显示运行时间coutendl;system(pause);return 0;template/参数为结点个

8、数n,和无向带权图中各结点之间的距离cN+1void Prim(int n,Type cN+1)Type lowcostN+1; /记录cjclosest的最小权值int closestN+1; /V-S中点j在s中的最临接顶点bool sN+1; /标记各结点是否已经放入S集合s1=true;/初始化si,lowcosti,closestifor(int i=2;i=n;i+)lowcosti=c1i;closesti=1;si=false;for(int i=1;in;i+)Type min=inf;int j=1;for(int k=2;k=n;k+)/找出V-S中是lowcost最小的顶点jif(lowcostkmin)&(!sk)/如果k的lowcost比min小并且k结点没有被访问min=lowcostk; /更新min的值j=k;coutj closestjendl; /输出j和最邻近j的点sj=true; /将j添加到s中for(int k=2;k=n;k+)if(cjklowcostk)&(!sk)/s集合放进j后更新各结点的lowcost的值lowcostk=cjk;closestk=j;-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁