最小生成树问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构与算法

课程设计报告

课程设计题目:最小生成树问题

专业班级:

姓名:学号:

设计室号:

设计时间: 2011-12-26 批阅时间:指导教师:*绩:

《数据结构与算法》课程设计报告

姓名:学号:专业:

一、课题:最小生成树问题

设计要求:

在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。

问题分析:

在n个城市间建立通信网络,需架设n-1条路线。求解如何以最低的经济代价建设此通信网,这是一个最小生成树问题。我们可以利用普利姆算法或者克鲁斯卡尔算法求出网的最小生成树,输入各城市的数目以及各个城市之间的距离。将城市之间的距离当做网中各点之间的权值。

二、功能、算法、体会描述:

系统有一个主界面,是选择界面。本系统一共有两种选择,克鲁斯卡尔算法求解和普利姆算法求解。根据提醒,输入相应数据,选择你想要的求解方式。第一种方式是克鲁斯卡尔算法。输入你想要建立网络的城市数量,然后输入它们两两之间的建设成本,运行得到网络的建立方式。第二种方式是普利姆算法,操作方法和第一种一致。

1.克鲁斯卡尔算法:

基本思想:

假设WN=(V, {E})是一个含有N个顶点的连通网。则按照克鲁斯卡

尔算法构造最小生成树的过程为:先构造一个只含n个顶点,而边集

为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它

是一个含有n棵树的一个森林。之后,从网的边集E中选取一条权值

最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也

就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条

边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最

小的边再试之。依次类推,直到森林中只有一棵树,也即子图中含有n-1条边为止。在此系统中,N是你所需要输入的城市个数。而每条边的权值就是你所输入的每两个城市之间的建设成本。

具体步骤:该算法的函数是main1( ) 。

先用struct edgenode

{

int frontvex;

int rearvex;

int weight;

};

typedef edgenode adgeset[maxedgenum];

定义边结点,并定义一个此类结点的数组adgeset。Main1中先用scanf("%d",&n)语句得到建立网络的城市个数n。随后,通过insit1(adgeset>,int n)函数中的

for( i=0;i

{

for(int j=i+1;j

{int x,y;x=i+1;y=j+1;

printf("请输入第%d个城市到第%d个城市的建设成本\n",x,y);

scanf("%d",&a);

GT[k].frontvex=i;

GT[k].rearvex=j;

GT[k].weight=a;

k++;

}

}

循环语句来得到每两个城市间的建设成本。

而后,通过

for(i=0;i

{

int min=20000,m=i;

for(int j=i;j

{

if(GT[j].weight

{

min=GT[j].weight;

m=j;

}

}

edgenode temp=GT[i];

GT[i]=GT[m];

GT[m]=temp;

}

}

来寻找两边还没有顶点的权值最小边。

紧接着,用void fun1(adgeset&GE,adgeset>,int n)函数来得到我们

所要的建设成本。最后通过display1(GE,n);函数来输出该算法所求

得的结果,即告知n-1条边该分别建立在哪几对城市之间。

2.普利姆算法:

基本思想:假设WN=(V,{E})是一个含有n个顶点的连通网,TV是WN上最小生成树中顶点的集合,TE是最小生成树中边的集合。显然,在算法

执行结束时,TV=V,而TE是E的一个子集。在算法开始执行时,

TE为空集,TV中只有一个顶点,因此,按普利姆算法构造最小生成

树的过程为:在所有“其一个顶点已经落在生成树上,而另一个顶点

尚未落在生成树上”的边中取一条权值为最小的边,逐条加在生成树

上,直至生成树中含有n-1条边为止。在此系统中,N是你所需要输

入的城市个数。而每条边的权值就是你所输入的每两个城市之间的建

设成本。

具体步骤:

该算法的函数是pum( ) 。

先用struct edgenode

{

int frontvex;

int rearvex;

int weight;

};

typedef edgenode adgeset[maxedgenum];

定义边结点,并定义一个此类结点的数组adgeset。Pum()中先用

scanf("%d",&n)语句得到建立网络的城市个数n。

接着,用函数void insitadj2(adjmatrix &GA)

{

for(int i=0;i

{

for(int j=0;j

{

GA[i][j]=20000;

}

}

}

来给矩阵里的元素全赋初值无穷大。然后通过void setadj2(adjmatrix &GA,int n)函数中的for(int i=0;i<=n;i++)

{

for(int j=i+1;j

{int y,w;y=i+1;w=j+1;

相关文档
最新文档