数据结构课程设计七
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计七
班级:06计本(1) 姓名:魏建平学号:20060724035
题目:严慰敏习题实习五第6题,求图的最小生成树问题:若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个最小生成树问题。
一、需求分析
1、利用克鲁斯算法求网的最小生成树,实现抽象数据类型MFSet,以此表示构造生成树
过程中的连通分量。
2、以文本形式输出生成树中各条边以及他们的权植。
3、用邻接矩阵表示法的形式建立图的存储结构。它采用两个数组来表示图:一个用来
存放图的顶点名字,另一个用来存储图中顶点之间关联关系的二维数组。
4、演示程序以用户和计算机的对话框执行,根据对话框所显示的内容,进行输入。最后进行
核对。
5、测试数据:
二、概要设计
1、抽象数据类型图的定义:
ADT Graph
数据对象V :—个集合,该集合中的所有元素具有相同的特性。数据关系R: R={VR}
VR={< x, y> | P(x,y ) n (x ,y € V) }
基本操作:
1): CreateGraph(G):
初始条件:图G存在。
操作结果:创建图G
2):DestoryGraph(G):
初始条件:图G存在。
操作结果:销毁图G
3):LocateVertex(G,v): 初始条件:图G 存在。
操作结果:确定顶点v在图G中的位置。若图G中没有顶点v,则函数值为空。
4):GetVertex(G,i):
初始条件:图G存在。
操作结果:取出图G的第i个顶点的值。若i大于图G的顶点数,则函数值为空。
5):FirstAdjVertex(G,v):
初始条件:图G存在。
操作结果:求图G中顶点n的第一个邻接点。若v无邻接点或图G中无顶点v,则函数值为空。6):NextAdjVertex(G,v,w):
初始条件:图G存在。
操作结果:一直w是图G中顶点v的某个邻接点,求顶点v的下一个邻接点(紧跟这w后面)。若w是v的最后一个邻接点,则函数值为空。
7):InsertVertex(G,u):
初始条件:图G存在。
操作结果:在图G中增加一个顶点u。
8):DeleteVertex(G,u):
初始条件:图G存在。
操作结果:删除图G的顶点v及其顶点v相关联的弧。
9):InsertArc(G,v,w):
初始条件:图G存在。
操作结果:在图G着那个增加一条从顶点v到顶点w的弧。
10):DeleteArc(G,v,w):
初始条件:图G存在。
操作结果:删除图G中从顶点v到顶点w的弧。
11):TraverGraph(G):
初始条件:图G存在。操作结果:按照某种次序,对图G的每个结点访问一次且仅访问一次。
2、主程序:
Void main()
{
接受命令(提示用户输入图的点数和边数) ;接受命令(提示用户输入各个顶点的值) ;接受命令(提示用户输入每条边的起点和终点及权值) ;输入结果;
3、本程序只有三个模块,调用简单:
上函数模块
矩阵模块图模块
三、详细设计
1、图及邻接矩阵结构定义:
#define MAX_NAME 5
#define MAX_VERTEX_NUM 20
typedef char Vertex[MAX_NAME];〃顶点名字串
邻接矩阵typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];〃struct
MGraph/* 定义图*/
{
Vertex vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vex nu m,arc num;
};
typedef struct
{
Vertex adjvex; /* 当前点*/
int lowcost;
}mi nside[MAX_VERTEX_NUM];
2、图定位函数:
int LocateVex(MGraph G ,Vertex u)// 定位
{
int i;
for(i=0;i<G .vexnum;++i)
if(strcmp(u,G .vexs[i])==0)
return i;
return -1;
}
3、图创建函数:
void CreateGraph(MGraph &G)
{
int i,j,k,w;
Vertex va,vb;
cout<<"请输入无向带权图G的点数和边数(以空格为分隔)
cin>>G.vexnum»G .arcnum;
cin>>G.vexnum;
for(i=0;i<G .vexnum;++i) /* 构造顶点集*/ scanf("%s",G .vexs[i]);
for(i=0;i<G .vexnum;++i) /* 初始化邻接矩阵*/ for(j=0;j<G .vexnum;++j)
G.arcs[i][j]=0x7fffffff;
cout<<" 请输入图的每条边的起点和终点,以及权值
:"<<endl;
cin>>G.arcnum;
for(k=0;k<G .arcnum;++k)
{ scanf("%s%s%d%*c",va,vb,&w); i=LocateVex(G ,va); j=LocateVex(G ,vb);
G.arcs[i][j]=G .arcs[j][i]=w; /* 对称*/
}
}
4、求最小生成树函数:void kruskal(MGraph G)
{
int set[MAX_VERTEX_NUM],i,j;
int k=0,a=0,b=0,min=G .arcs[a][b]; for(i=0;i<G .vexnum;i++)
set[i]=i;
cout<<" 图的最小生成树为:"<<endl;
while(k<G .vexnum-1)
{
for(i=0;i<G .vexnum;++i) for(j=i+1;j<G .vexnum;++j) if(G.arcs[i][j]<min) { min=G.arcs[i][j]; a=i; b=j;
} min=G.arcs[a][b]=0x7fffffff; if(set[a]!=set[b])
{
printf("%s-%s\n",G .vexs[a],G.vexs[b]); k++;
for(i=0;i<G .vexnum;i++) if(set[i]==set[b]) set[i]=set[a];
}
}
5、主函数:
void mai n()
{
MGraph g;
CreateGraph(g);
kruskal(g);
}
四、调试分析
1、求图的最小生成树的问题是一个很有意义,也很有挑战的问题,如果能对任意图求
出其最小生成树,那么这将成为一个很有商业价值的产品。
2、求最小生成树除了克鲁斯算法还有普里姆算法,我们应该综合使用两种方法,比较
其执行效率,然后选择较优的方法。本程序只使用了一各种方法,程序不够完美。
3、由于克鲁斯算法思想书上已经给出,所以这个题目并不难做。
五、用户手册
1、本程序的运行环境为DOS操作环境,文件名为5_6.exe;
2、本例演示程序简单明了,按程序提示操作即可。