- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
贪心法构造最小生成树
实验二
实验名称: 利用贪心法构造最小生成树
实验时间: 2012年12月 成绩:
一、实验目的
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树上各边权的总和为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。
本实验的目的是利用贪心法构造最小生成树。
二、实验内容
设G=(V,E)是连通带权图,V={1,2,… n}。
构造G的最小生成树的Prim算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就做如下的贪心选择:选取满足条件i∈S,j∈V-S,且c[i][j]最小的边,并将顶点j添加到S中。这个过程一直进行到S=V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生成树。算法描述如下:
Void Prim(int n,int **c)
{
T=φ;
S={1};
While(S!=V) {
(i,j)=i∈S且j∈V-S的最小权边;
T=T∪{(i.j)};
S=S∪{j};
}
}
算法结束时,T中包含G的n-1条边。利用最小生成树性质和数学归纳法容易证明,上述算法中的边集合T始终包含G的某棵最小生成树中的边。因此,在算法结束时,T中的所有边构成G的一棵最小生成树。
在上述Prim算法中,还应当考虑如何有效地找出满足条件i∈S,j∈V-S,且权c[i][j]最小的边(i,j)。实现这个目的的较简单的方法是设置两个数组closest和lowcost。对于每一个j∈V-S,closest[j]是j在S中的邻接顶点,它与j在S中的其他邻接顶点k相比较有c[j][closest[j]]=c[j][k]。lowcost[j]的值就是c[j][ closest[j]]。
在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closest[j])#includeiostream
using namespace std;
const int maxint=1000000; //定义一个极大数maxint
void Prim(int n,int **c); //提前申明快排函数Prim
int main()
{
int n,l; //顶点数和边数
int start,end,distance; //各边的起点终点和权
cout请输入顶点数: ;
cinn;
cout请输入边数: ;
cinl;
int **c=new int*[100]; //建立数组c[][] 这是一个二维指针,生成指向整形的n个一维数组指针
for(int i=0;i100;i++)
{c[i]=new int[100];} //生成每个指针为指向m个整形空间的一维数组指针
for(i=1;i=n;i++)
for(int j=1;j=n;j++)
{
c[i][j]=maxint;
//c[i][j]为一个极大数,即i,j不连通
}
for(i=1;i=l;i++)
{
cout请输入第 i 条边的起点、终点和权值 ;
cinstartenddistance;
c[start][end]=distance;
c[end][start]=distance;
}
Prim(n,c); //调用快排函数Prim
return 0;
}
void Prim(int n,int **c)
{
int lowcost[100];
//lowcost[j]的值就是c[j][closest[j]],即与邻接顶点的距离
int closest[100];
//closest[j]是j在S中的邻接顶点,即与哪个顶点更近
bool s[100]; //s[]标记s[j]是否在S中
s[1]=true;
for(int i=2;i=n;i
原创力文档


文档评论(0)