最小生成树问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;