最小生成树问题课程设计报告Word文档格式.doc
《最小生成树问题课程设计报告Word文档格式.doc》由会员分享,可在线阅读,更多相关《最小生成树问题课程设计报告Word文档格式.doc(25页珍藏版)》请在冰豆网上搜索。
通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、培养算法分析能力。
分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。
二.设计内容
最小生成树问题:
设计要求:
在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
存储结构采用多种。
求解算法多种。
三.概要设计
1、功能模块图
开始
创建一个图
功能选择
1.建立邻接矩阵
2.建立邻接表
3.PRIM算法
4.
kruscal算法
结束
2、各个模块详细的功能描述
※创建一个图:
通过给用户信息提示,让用户将城市信息及城市之间的联系关系和连接权值写入程序,并根据写入的数据创建成一个图。
※功能选择:
给用户提示信息,让用户选择相应功能。
※建立邻接矩阵:
将用户输入的数据整理成邻接矩阵并显现在屏幕上。
※建立邻接表:
将用户输入的数据整理成临接表并显现在屏幕上。
※PRIM算法:
利用PRIM算法求出图的最小生成树,即:
城市之间最经济的连接方案。
四.详细设计
1.主函数和其他函数的伪码算法
※主函数:
voidmain()
{
MGraphG;
Dgevaluedgevalue;
CreateUDG(G,dgevalue);
charu;
cout<
<
"
图创建成功。
;
请根据如下菜单选择操作。
\n"
*****************************************"
endl;
**1、用邻接矩阵存储:
********************"
**2、用邻接表存储:
**********************"
**3、普里姆算法求最经济的连接方案********"
**4、克鲁斯卡尔算法求最经济的连接方案****"
endl<
ints;
chary='
y'
while(y='
)
{
cout<
请选择菜单:
cin>
>
s;
switch(s)
{
case1:
cout<
用邻接矩阵存储为:
Adjacency_Matrix(G);
break;
case2:
用邻接表存储为:
Adjacency_List(G,dgevalue);
case3:
普里姆算法最经济的连接方案为:
请输入起始城市名称:
cin>
u;
MiniSpanTree_PRIM(G,u);
case4:
克鲁斯卡尔算法最经济的连接方案为:
MiniSpanTree_KRSL(G,dgevalue);
default:
cout<
您的输入有误!
}
是否继续?
y/n:
y;
if(y=='
n'
}
}
※邻接矩阵和临接表的创建:
intCreateUDG(MGraph&
G,Dgevalue&
dgevalue)//构造无向加权图的邻接矩阵
{
inti,j,k;
cout<
请输入城市个数及其之间的可连接线路数目:
cin>
G.vexnum>
G.arcnum;
请输入各个城市名称(分别用一个字符代替):
for(i=0;
i<
G.vexnum;
++i)
cin>
G.vexs[i];
++i)//初始化数组
for(j=0;
j<
++j)
{
G.arcs[i][j].adj=MAX;
}
请输入两个城市名称及其连接费用(严禁连接重复输入!
):
for(k=0;
k<
++k)
{
cin>
dgevalue[k].ch1>
dgevalue[k].ch2>
dgevalue[k].value;
i=LocateVex(G,dgevalue[k].ch1);
j=LocateVex(G,dgevalue[k].ch2);
G.arcs[i][j].adj=dgevalue[k].value;
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
returnOK;
※临接矩阵的输出:
voidAdjacency_Matrix(MGraphG)//用邻接矩阵存储数据
{
inti,j;
for(i=0;
i<
i++)
j<
j++)
if(G.arcs[i][j].adj==MAX)
cout<
0<
"
else
G.arcs[i][j].adj<
cout<
※邻接表的输出:
voidAdjacency_List(MGraphG,Dgevaluedgevalue)//用邻接表储存数据
i++)
{
cout<
G.vexs[i]<
->
for(j=0;
j++)
if(dgevalue[j].ch1==G.vexs[i]&
&
dgevalue[j].ch2!
=G.vexs[i])
dgevalue[j].ch2<
elseif(dgevalue[j].ch1!
=G.vexs[i]&
dgevalue[j].ch2==G.vexs[i])
dgevalue[j].ch1<
\b\b"
}
※最小生成树PRIM算法:
voidMiniSpanTree_PRIM(MGraphG,charu)//普里姆算法求最小生成树
Closedgeclosedge;
k=LocateVex(G,u);
for(j=0;
j++)//辅助数组初始化
if(j!
=k)
closedge[j].adjvex=u;
closedge[j].lowcost=G.arcs[k][j].adj;
closedge[k].lowcost=0;
for(i=1;
k=Minimum(G,closedge);
城市"
closedge[k].adjvex<
与城市"
G.vexs[k]<
连接。
closedge[k].lowcost=0;
++j)
{
if(G.arcs[k][j].adj<
closedge[j].lowcost)
{
closedge[j].adjvex=G.vexs[k];
closedge[j].lowcost=G.arcs[k][j].adj;
}
}
intMinimum(MGraphG,Closedgeclosedge)//求closedge中权值最小的边,并返回其顶点在vexs中的位置
inti,j;
doublek=1000;
if(closedge[i].lowcost!
=0&
closedge[i].lowcost<
k)
k=closedge[i].lowcost;
j=i;
returnj;
※最小生成树kruscal算法:
voidMiniSpanTree_KRSL(MGraphG,Dgevalue&
dgevalue)//克鲁斯卡尔算法求最小生成树
intp1,p2,i,j;
intbj[MAX_VERTEX_NUM];
//标记数组
i++)//标记数组初始化
bj[i]=i;
Sortdge(dgevalue,G);
//将所有权值按从小到大排序