- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
贪心算法1解析
贪心法求解思路 ESetType SpanningTree(ESetType E,int n) { //G=(V,E)为无向图,E是图G的边集,n是图中结点数 ESetType TE=?; //TE为生成树上边的集合 int u,v,k=0; EType e; //e=(u,v)为一条边 while(kn-1 E中尚有未检查的边) { //选择生成树的n-1条边 e=select(E); //按最优量度标准选择一条边 if(TE∪e 不包含回路) //判定可行性 {//在生成树边集TE中添加一条边 TE=TE∪e; k++; } } return S; } …… U V-U 将贪心策略用于求解无向连通图的最小代价生成树时,核心问题是需要确定贪心准则。 根据最优量度标准,算法的每一步从图中选择一条符合准则的边,共选择n-1条边,构成无向连通图的一棵生成树。 贪心法求解的关键:该量度标准必须足够好。它应当保证依据此准则选出n-1条边构成原图的一棵生成树,必定是最小代价生成树。 4.8 最小生成树 贪心选择标准,当前最优 Prim算法 Prim算法的贪心准则:在保证S所代表的子图是一棵树的前提下选择一条最小代价的边e=(u,v)。 在图G=(V, E) (V表示顶点集合,E表示边集合)中,从集合V中任取一个顶点(例如取顶点v1)放入集合U中,这时U={v1},生成树边集合T(E)为空。 寻找与S中顶点相邻(另一顶点在V-U中)权值最小的边的另一顶点v2,并使v2加入S。即U={v1,v2 },同时将该边加入集合T(E)中。 重复2,直到U=V为止。 这时T(E)中有n-1条边,T=(U,T(E))就是一棵最小生成树。 算法思想: 4.8 最小生成树 V1 V6 V5 V4 V3 V2 6 5 1 3 5 6 6 4 2 5 算法步骤: 设 G=(V, E) 是连通网,TE 是 G 上 最小生成树中边的集合。 初始令 U={u0}, (u0?V ), TE={ }。 在所有 u?U, v?V-U 的边 (u, v)?E 中, 找一条代价最小的边 (u0, v0)。 将 (u0, v0) 并入集合 TE,同时 v0 并入 U。 重复上述操作直至 U=V 为止,则 T=(V, TE) 为 G 的最小生 成树。 V0 V2 V5 V3 V1 V4 求解过程 Prim算法 4.8 最小生成树 贪心选择标准,当前最优 求解过程 Prim算法 4.8 最小生成树 Prim算法 算法描述 算法思路: 首先置S={1}, T= ? .若S?V, 就作如下的贪心选择: 选取满足条件i?S, j?V-S,且c[i][j]最小的边(i, j),将顶点j添加到S中边(i, j)添加到T中.这个过程一直进行到S=V时为止. T中的所有边构成G的一棵最小生成树。 void Prim(int n, Type * * c) { T= ?; S ={1}; while (S!= V) { (i, j) = i ? S且 j?V- S的最小权边; T=TU{(i,j)}; S= S U{j}; } } 设G=(V,E)是一个连通带权图, y={l, 2, …, n}。 关键步骤:如何选取满足条件i?S, j?V-S,且c[i][j]最小的边(i, j), 成了算法难点问题。通过设置两个数组closest和lowcost。对于每个j ?V-S,closest[j]是j在S中的邻啊接顶点,它与j在S中的其他邻接顶点k相比较有c[j][closet[j]] ≤c[j][k]。lowcost[j]的值就是c[j][closest[j]] 4.8 最小生成树 template class Type void Prim(int n, Type * * c) { Type lowcost[maxint];//到S的最短距离 int closest[ maxint];//S中最短连接点 bool s[maxint]; s[1] = true; for(int i = 2;i= n; i++){//初始化 lowcost[i] = c[l][i]; closest[ i] = 1; s[i]= fals
文档评论(0)