欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    最小生成树算法详解.ppt

    • 资源ID:66040980       资源大小:620.50KB        全文页数:35页
    • 资源格式: PPT        下载积分:11.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要11.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    最小生成树算法详解.ppt

    最小生成树算法-prim&Kruskal生成树的概念q生成树一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。生成树不唯一V3V2V4V1V6V5V3V2V4V1V6V5V3V2V4V1V6V5V3V2V4V1V6V5生成树最小代价生成树q生成生成树的代价等于其的代价等于其边上的上的权值之和。之和。V4V1V3V2V6V56512665534V4V1V3V2V6V561654V4V1V3V2V6V512534最小代价生成树F两种常用的构造最小生成树的方法:普里姆算法(prim)克鲁斯卡尔算法(Kruskal Kruskal)普里姆(Prim)算法q假假设N=(VN=(V,E)E)是是连通网,通网,TETE是是N N上最小生成上最小生成树中中边的集合。的集合。q算法从算法从U=uU=u0 0(u(u0 0V)V),TE=TE=开始,重复开始,重复执行下述操作:行下述操作:F在所有在所有uUuU,vV-UvV-U的的边(u(u,v)v)中找一条代价最小的中找一条代价最小的边(u(u0 0,v,v0 0),),将其将其并入集合并入集合TETE,同,同时将将v v0 0并入并入U U集合。集合。F当当U=VU=V则结束,此束,此时TETE中必有中必有n-1n-1条条边,则T=(VT=(V,TE)TE)为N的最小生的最小生成成树。q普里姆算法构造最小生成普里姆算法构造最小生成树的的过程是从一个程是从一个顶点点U=uU=u0 0 作初作初态,不断,不断寻找与找与U U中中顶点相点相邻且代价最小的且代价最小的边的另一个的另一个顶点,点,扩充到充到U U集合直至集合直至U=VU=V为止。止。V4V1V3V2V6V56512665534V4V1V3V2V6V512534UV-UV1 V2,V3,V4,V5,V6 步骤(0)V1,V3 V2 ,V4,V5,V6(1)V1,V3,V6 V2 ,V4,V5(2)V1,V3,V6,V4 V2,V5(3)V1,V3,V6,V4,V2 V5(4)V1,V3,V6,V4,V2,V5 (5)最小代价生成树q普里姆算法求最小生成树:从生成树中只有一个顶点开始,到顶点全部进入生成树为止V4V1V3V2V6V5165V1V31V1 V2,V3,V4,V5,V6 步骤(0)V1,V3 V2 ,V4,V5,V6(1)UV-Uq普里姆算法求最小生成树:从生成树中只有一个顶点开始,到顶点全部进入生成树为止最小代价生成树V4V1V3V2V6V565V1V31V1 V2,V3,V4,V5,V6 步骤(0)V1,V3 V2 ,V4,V5,V6(1)V6V1,V3,V6 V2 ,V4,V5(2)46554UV-Uq普里姆算法求最小生成树:从生成树中只有一个顶点开始,到顶点全部进入生成树为止最小代价生成树V4V1V3V2V6V565V4V1V31V1 V2,V3,V4,V5,V6 步骤(0)V1,V3 V2 ,V4,V5,V6(1)V6V1,V3,V6 V2 ,V4,V5(2)4655V1,V3,V6,V4 V2,V5(3)262UV-Uq普里姆算法求最小生成树:从生成树中只有一个顶点开始,到顶点全部进入生成树为止最小代价生成树V4V1V3V2V6V56V4V1V31V1 V2,V3,V4,V5,V6 步骤(0)V1,V3 V2 ,V4,V5,V6(1)V2V6V1,V3,V6 V2 ,V4,V5(2)465V1,V3,V6,V4 V2,V5(3)62V1,V3,V6,V4,V2 V5(4)5UV-Uq普里姆算法求最小生成树:从生成树中只有一个顶点开始,到顶点全部进入生成树为止最小代价生成树V4V1V3V2V6V5V4V1V31V1 V2,V3,V4,V5,V6 步骤(0)V1,V3 V2 ,V4,V5,V6(1)V2V6V5V1,V3,V6 V2 ,V4,V5(2)46V1,V3,V6,V4 V2,V5(3)62V1,V3,V6,V4,V2 V5(4)5V1,V3,V6,V4,V2,V5 (5)33UV-Uq普里姆算法求最小生成树:从生成树中只有一个顶点开始,到顶点全部进入生成树为止最小代价生成树q普里姆算法求最小生成树:从生成树中只有一个顶点开始,到顶点全部进入生成树为止V4V1V3V2V6V5V4V1V31V1 V2,V3,V4,V5,V6 步骤(0)V1,V3 V2 ,V4,V5,V6(1)V2V6V5V1,V3,V6 V2 ,V4,V5(2)4V1,V3,V6,V4 V2,V5(3)2V1,V3,V6,V4,V2 V5(4)5V1,V3,V6,V4,V2,V5 (5)3UV-U最小代价生成树普里姆(Prim)算法生成树中只放置一个顶点在关联生成树顶点的边中(即边的一个顶点在生成树中,另一个顶点不在)取权值最小者将选中的边加入生成树,同时将该边的关联顶点加入生成树中生成树中顶点数小于n?是否结束开始l从从键盘(或数据文件)(或数据文件)输入入图的信息,用普里姆算法求解的信息,用普里姆算法求解给定无向定无向连通通图的最小生成的最小生成树,最后,最后输出最小生成出最小生成树中的中的权值和所有的和所有的边,图的存的存储结构自行构自行设定。定。基本要求基本要求F例如 下图的输出为weight:15(v1,v3)(v3,v6)(v6,v4)(v3,v2)(v2,v5)或者(1,3)(3,6)(6,4)(3,2)(2,5)普里姆算法的实现q顶点集合如何表示?点集合如何表示?q最小最小边如何如何选择?q一个一个顶点加入点加入U U集合(生成集合(生成树中)中)如何表示?如何表示?struct int adjvex;double lowcost;closedgeMAX_VERTEX_NUM;closedgei.adjvex=kclosedgei.lowcost顶点i与顶点k邻接顶点k已经在U集合中顶点i加入U集合时=0adjvexlowcostv16v11v15v1v2,v3,v4,v5,v63v2v3v4v5v6UV-Uk 顶点iclosedgeclosedge2.adjvex=1 .lowcost=6closedge3.adjvex=1 .lowcost=1closedge4.adjvex=1 .lowcost=5V4V1V3V2V6V5165F当当U集合中加入一个新集合中加入一个新顶点点时,V-U集合中的集合中的顶点到点到U的最小代价的最小代价边可能会更新可能会更新V4V1V3V2V6V56512665534U集合的成员:V-U集合的成员:closedge5.adjvex=1 .lowcost=closedge6.adjvex=1 .lowcost=adjvexlowcostv16v11v15v1v2,v3,v4,v5,v63adjvexlowcostv350v15v36v34v1,v3v2,v4,v5,v66v2v3v4v5v6UV-Uk 顶点iclosedgeV4V1V3V2V6V55564U集合的成员:V-U集合的成员:F当当U集合中加入一个新集合中加入一个新顶点点时,V-U集合中的集合中的顶点到点到U的最小代价的最小代价边可能会更新可能会更新V4V1V3V2V6V56512665534closedge2.adjvex=3 .lowcost=5closedge4.adjvex=1 .lowcost=5closedge5.adjvex=3 .lowcost=6closedge6.adjvex=3 .lowcost=4adjvexlowcostv16v11v15v1v2,v3,v4,v5,v63adjvexlowcostv350v15v36v34v1,v3v2,v4,v5,v66adjvexlowcostv350v62v360v1,v3,v6v2,v4,v5 4v2v3v4v5v6UV-Uk 顶点iclosedgeV4V1V3V2V6V5562V4V1V3V2V6V56512665534F当U集合中加入一个新顶点时,V-U集合中的顶点到U的最小代价边可能会更新U集合的成员:V-U集合的成员:closedge2.adjvex=3 .lowcost=5closedge4.adjvex=6 .lowcost=2closedge5.adjvex=3 .lowcost=6adjvexlowcostv16v11v15v1v2,v3,v4,v5,v63adjvexlowcostv350v15v36v34v1,v3v2,v4,v5,v66adjvexlowcostv350v62v360v1,v3,v6v2,v4,v5 4adjvexlowcostv3500v360v1,v3,v6,v4v2,v5 v2v3v4v5v6UV-Uk 顶点iclosedge2V4V1V3V2V6V556F当U集合中加入一个新顶点时,V-U集合中的顶点到U的最小代价边可能会更新U集合的成员:V-U集合的成员:V4V1V3V2V6V56512665534closedge2.adjvex=3 .lowcost=5closedge5.adjvex=3 .lowcost=6adjvexlowcostv16v11v15v1v2,v3,v4,v5,v63adjvexlowcostv350v15v36v34v1,v3v2,v4,v5,v66adjvexlowcostv350v62v360v1,v3,v6v2,v4,v5 4adjvexlowcostv3500v360v1,v3,v6,v4v2,v5 2adjvexlowcost000v230v1,v3,v6,v4,v2v5 v2v3v4v5v6UV-Uk 顶点iclosedge5V4V1V3V2V6V53F当U集合中加入一个新顶点时,V-U集合中的顶点到U的最小代价边可能会更新V4V1V3V2V6V56512665534U集合的成员:V-U集合的成员:adjvexlowcostv16v11v15v1v2,v3,v4,v5,v63adjvexlowcostv350v15v36v34v1,v3v2,v4,v5,v66adjvexlowcostv350v62v360v1,v3,v6v2,v4,v5 4adjvexlowcostv3500v360v1,v3,v6,v4v2,v5 2v2v3v4v5v6UV-Uk 顶点iclosedgeV4V1V3V2V6V5adjvexlowcost00000v1,v3,v6,v4,v2,v5adjvexlowcost000v230v1,v3,v6,v4,v2v5 514253U集合的成员:V-U集合的成员:V4V1V3V2V6V56512665534图采用邻接矩阵表示普里姆算法求最小生成树普里姆算法求最小生成树 6 1 5 6 5 3 1 5 5 6 4 5 5 2 3 6 6 4 2 6 1234561 2 3 4 5 6graph.arac=#include#include#include#define INIT 63355#define NUM 20using namespace std;typedef int Elemtype;typedef struct Tnode Elemtype vexNUM;int aracNUMNUM;int v,e;graph;void Init_Graph(graph&g)for(int i=1;i=g.v;i+)for(int j=1;j=g.v;j+)g.aracij=INIT;void Create_Graph(graph&g)cout输入顶点,边数目:g.vg.e;Init_Graph(g);cout输入顶点信息:endl;for(int i=1;ig.vexi;cout输入顶点间下标和权值:endl;int k,t,w;for(int i=1;iktw;g.arackt=w;g.aractk=g.arackt;void Prim(graph&g)int min_cost=0;int lowcostNUM;/当前最短距离 int closestNUM;/顶点的相邻顶点(closesti则为i的邻接点)int sNUM;/标志访问节点 for(int i=1;i=g.v;i+)closesti=1;/初始置各顶点得邻接点为1 lowcosti=g.arac1i;/初始置各顶点的最短距离为1到顶点的距离 si=0;for(int i=1;ig.v;i+)int min=INIT;/min初始化无穷大 int j=1;for(int k=2;k=g.v;k+)if(lowcostkmin&!sk)/找出与源点相连,且权值最小的顶点 min=lowcostk;j=k;min_cost+=min;coutclosestjjendl;/输出符合最小生成树的顶点 sj=1;/已访问顶点置1 for(int t=2;t=g.v;t+)if(g.aracjtlowcostt&!st)/从新添加的顶点j出发,将与j相邻的顶点间的权值 /与上一顶点的相邻顶点间的权值进行比较。选出最小权值和相应顶点.lowcostt=g.aracjt;closestt=j;cout最小生成树得最短路径为:min_costendl;KruskalKruskal最小生成树KruskalKruskal算法步骤:算法步骤:5642311653465265a.带权图此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。1.把图中的所有边按代价(权值)从小到大排序;2.将图中的所有边都去掉。3.将边按权值从小到大的顺序添加到图中,保证添加的过程中不会形成环(用并查集检测)4.重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。1KruskalKruskal最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图5642316534652651经典应用最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图5642316534652651经典应用最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图5642316534652651经典应用最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图5642316534652651经典应用最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图56423165346526534这条边(蓝色表示)加入会形成环,所以这条边不能用1经典应用最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图56423165346526514这条边(蓝色表示)加入会形成环,所以这条边不能用1经典应用最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图5642316534652651经典应用最小生成树5 5、算法过程示意:、算法过程示意:5642311653465265原始图5642315342最小生成树克鲁斯卡尔(Kruskal)算法否将当前这条边加入生成树后是否形成回路?在生成树中放置n个孤立顶点(即并查集里顶点的初始化)根据边上的权值从小到大排序是将该边加入生成树中继续选择下一条边生成树中边数小于n-1?是否结束开始代码参考

    注意事项

    本文(最小生成树算法详解.ppt)为本站会员(wuy****n92)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

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

    收起
    展开