克鲁斯卡尔算法作业

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return 0;
else/*x1和x2属于同一连通分支*/
return 1;
}
四、调试分析
1.本程序利用克鲁斯卡尔算法求最小生成树数据结构清晰因而条是比较顺利。
2.在调试过程中主要是参数的传递比较不容易掌握。
3.本程序的关键部分是如何确定一条边的两个端点是否属于同一连通分支,合并两个连通分支,这也正是为什么要选择该数据结构的原因。
题目:利用克鲁斯卡尔算法构造一棵最小生成树
姓名:吴新华学号:20010155班级试0101完成日期:2003-6-2
一、需求分析
1.问题的描述:假设有n个城市之间建立通信网,则连通n个城市只需n-1条线路。这里自然考虑怎样建立这n-1条路是总费用最省。
2.把这n个城市抽象成一个连通网,网的顶点表示各个城市,顶点与顶点之间的边表示通信线路,赋予边上的权值表示相应的代价。
操作结果:创建一个图包括两个部分顶点集和边集
int smallweight(Graph *g)
初始条件:图已经存在并且初始化
操作结果:查找权值最小的边并返回它的地址
int samefrom(Graph *g ,int x1,int x2)
初始条件:存在图g和顶点x1,x2
操作结果:判断x1和x2是否属于同一连通分支
3.本程序的目的是要建立一棵生成树使总费用最少
二、概要设计
1.抽象数据类型定义如下
ADT Graph{
数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR}
VR={(u,v)|u,v∈V,w是边(v,w)的权值,∑Wi最小}
基本操作:
void CreateGraph (Graph *g)
while (x>=0) {/*求x1的根结点*/
t1=x1;
x=g->gelist[x].parent;
}
while(y>=0){/*求x2的根结点*/
t2=y;
y=g->gelist[y].parent;
}
if(x!=y)/*x1和x2属于不同的连通分支*/
{
gelist[t2].parent=t1;/*合并x1,x2所属的连通分支*/
}//for完成求最小边
return t;//返回权值最小的边的地址
}
int samefrom(Graph *g ,int x1,int x2)
{/*查找x1和x2所属的子集的根,判断他们是否相等*/
x=g->gelist[x1].parent;y=g->gelist[x2].parent;
/*x和y分别是x1和x2父亲结点的地址*/
void kruskial(Graph *g)
初始条件:连通图g已经存在
操作结果:生成一棵最小生成树
}ADT Graph
2.主程序
void main()
{
变量定义及初始化;
函数调用并输出结果;
}
3.本程序的模块调用关系
三、详细设计
1.顶点、边和图的类型
typedef struct GTnode{
TElemtype data ; /*顶点的数据域*/
{inti,x1,x2,k;
for(i=0;i<g.vexnum-1;i++)//求n-1条边
{
m=smallweight(gelist);/*查找最小边地址*/
x1=g->gelist[m].fromvex;//最小边始点地址
x2=g->gelist[m].endvex;//最小边终点地址
k=samefrom(x1,x2);/*判断是否属于同一个连通分支*/
int smallweight(Graph *g)
{Fra Baidu bibliotek
int sweight=9999;//定义临时变量存放权值
for(i=0;i<g.vexnum,gelist[i].tags==0;i++)
if(gelist[i].sweight<sweight)
{ t=i;/*地址附给变量t*/
sweight=gelist[i].sweight;
int n,e;cin>>n>>e;/*输入顶点总数及边总数*/
为图申请空间;
for (i=0;i<n;i++)
{/*初始化顶点序列*/
cin>>g->vexlist[i].data;
g->vexlist[i].parent=i;/*以i为根结点的n个子集,相当于n个连通分支。*/
}
for(i=0;i<e;i++)
intparent ;/*双亲的位置域*/
}GTnode;结点结构类型
typedef struct Gedge{
int fromvex;/*边的始点位置域*/
int endvex ;/*边的终点位置域*/
int weight ;/*边的权值域*/
int tags ;/*边的访问标志域*/
}Arclist;/*边的结构类型*/
typedef struct Graph{
GTnode vexlist;/*顶点数组*/
Arclist gelist;/*边集数组*/
int vexnum, edgnum; /*顶点和边总数*/
}graph;/*图数据结构类型*/
图的基本操作:
void CreateGraph (Graph *g)
{/*创建图并初始化连通分支,初始化边集*/
cin>>g->gelist[i].fromvex;/*输入始点编号值*/
cin>>g->gelist[i].endvex;/*输入终点编号值*/
cin>>g->gelist[i].weight;/*输入权值*/
g->gelist[i].tags=0;/*初始化边访问标志*/
}
void kruskial(Graph *g)
if(k==1) /*当x1,x2属于同一个连通分支
则只要修改该边的访问标志域*/
gelist[m].tags=1;
else{ /*当x1,x2属于同一个连通分支*/
gelist[m].tags=1;/*修改边的访问标志域*/
cout<<gelist[m];//输出这条边
}//else
}//for
}
4.用户在使用本程序的时候首先要看说明,然后在使用时可以按提示操作即可。
五、测试结果(略)
六、附录(略)
相关文档
最新文档