- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验13 快速排序11
实验13 快速排序
姓名:江婷 班级:计科三班 学号:09 完成日期:2010/12/01
一、需求分析
本程序需要将n 件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。当有 n 件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。
从文件中读入图的信息。
利用克鲁斯卡尔算法求网的最小生成树。
以文本形式生成树中各条边以及他们的权值。
构造生成树的网一定是无向网。并设顶点数不超过30个,边权值为小于100的整数。
根据克鲁斯卡尔算法的特点,为便于选择选择权值小的边,存储结构不选用邻接矩阵和邻接表,而是可以用存储边(带权)的数组表示图。
二、概要设计
抽象数据类型
最小生成树的初始状态为只有n个顶点而无边的非连通图,图中每个顶点自成一个连通分量,所以要定义一个图的抽象数据类型。
ADT Graph{
数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={v,w|v,wV且P(v,w),v,w表示从v到w的弧,谓词P(v,w)定义 了弧v,w的信息}
基本操作P:
Status CreateDGraph(ALGraph G,V,VR);//采用邻接表存储表示,构造 有向图G(G.kind=DG)。
int FirstAdjVex(G,v);//若G中存在顶点v,则返回该顶点在图中位置;
//否则返回-1.
Status DeleteArc(G,v,w);//在G中删除弧v,w。
int FindInDegree(G,ndegree[]);//求顶点的入度。
}ADT Graph
生成树T的每个连通分量可看成是一个等价类,则构造T加入新的边的过程类似于求等价类的过程,由此可以用MFSet类型来描述T,使构造T的过程仅需O(e log e)的时间。
ADT MFSet{
数据对象:若设S是MFSet型的集合,则它由n(n0)个子集S(i=1,2,…,n)构成,每个子集的成员都是子界[-maxnumber , maxnumber]内的整数;
数据关系:=S
基本操作:
Void Initial(S,n,);
操作结果:初始化操作。构造一个由n个子集(每个子集只含单个成员x)构成的集合S。
Int fix_mfset(S,x);
初始条件:S是已存在的集合,x是S中某个子集的成员。
操作结果:查找函数。确定S中x所属子集S。
Status mix_mfset(S,i,j);
初始条件:S和S是S中的两个互不相交的非空集合。
操作结果:归并操作。将S和S中的一个并入另一个中。
}ADT MFSet;
算法的基本思想
最小生成树的MST性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中uU,vV-U,则必存在一棵包含边(u,v)的最小生成树。
克鲁斯卡尔算法思想:假设连通网N=(V,{E}),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{ }),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。依次类推,直至T中所有顶点都在同一连通分量上为止。
程序的流程
程序由三个模块组成:
输入模块:完成图中边数和顶点的输入。
构造最小生成树并输出模块:实现最小生成树的构建,并将结果输出到屏幕。
三、详细设计
物理数据类型
为便于实现查找和归并操作,则ADT MFSet的树应采用双亲表示法存储结构,如下所示:
typedef PTree MFSet;
int fix_mfset(MFSet S,int i){
//确定集合S中i所在子集,并将从i至根路径上所有结点都变成根的孩子结点。
if(i1||iS.n) return -1; //i不属于S中任一子集
for(j=i;S.nodes[j].parent0;j=S.nodes[j].parent);
for(k=i;k!=j;k=t){
t=S.nodes[k].parent;
S.nodes[k].parent=j;
}
return j;
}//fix_mfset
Status mix_mfset(MFSet S,int i,int j){
//S.nodes[i]和S.nodes[j]分别为S的互不相交的两个子集Si和Sj的根结点。
//并求集Si并Sj.
if(i1||iS.n||j1||jS.n) return ERROR;
if(S.nodes[i].parentS.nodes[j].parent){
原创力文档


文档评论(0)