最小生成树课程设计.docx
《最小生成树课程设计.docx》由会员分享,可在线阅读,更多相关《最小生成树课程设计.docx(7页珍藏版)》请在冰豆网上搜索。
最小生成树课程设计
最小生成树课程设计
中北大学
数据结构与算法课程设计
说明书
学院、系:
软件学院
专业:
软件工程
学生姓名:
xx
学号:
xxx
设计题目:
最小生成树问题
起迄日期:
2013年12月9日-2013年12月20日
指导教师:
李波
2013年12月20日
1需求分析
设计内容:
给定一个地区的n个城市间的距离网,用prim算法或kruskal算法建立最小生成树,并计算得到的最小生成树的代价。
基本要求:
(1)城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。
要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价;
(2)表示城市间距离网的邻接矩阵(要求至少6个城市,10条边);
(3)最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。
2本设计所采用的数据结构
本程序设计所采用的数据结构为图。
3设计思想
普里姆算法
4核心代码
intmain()//主函数
{mgraphg;vertextypeu;intk;
createUDN(&g);/*生成邻接矩阵结构的图*/
printf("\nThegraphis:
\n");
print(g);/*输出邻接矩阵*/
printf("inputthecityyouwanttostart:
");
scanf("%s",u);/*输入最小生成树的起点*/
k=locatedvex(g,u);
while(k==-1){
printf("thenameofthecityiswrong!
\n");
printf("inputthecityyouwanttostartagain:
");
scanf("%s",u);
k=locatedvex(g,u);
}
minispantree(g,u);/*普里姆算法求最小生成树*/
}
4代码
#include"stdio.h"
#include"string.h"
#definemaxnum20/*图的最大顶点数*/
#defineINFINITY1000/*定义一个权值的最大值*/
typedefcharvertextype[20];/*定义城市名称*/
typedefstructarccell
{
intadj;/*弧的权值*/
int*info;/*弧上相关信息的指针*/
}arccell;
typedefstructarray
{
vertextypeadjvex;/*顶点的邻接点*/
intlowcost;/*某顶点与已构造好的部分生成树的顶点之间的最小权值*/
}array;
typedefstruct{
vertextypevexs[maxnum];/*顶点向量*/
arccellarcs[maxnum][maxnum];/*邻接矩阵*/
intvexnum,arcnum;/*图的顶点个数和弧个数*/
arrayclosedge[maxnum];/*用普里姆算法求最小生成树时的辅助数组*/
}
mgraph;
voidcreateUDN(mgraph*g)
{
/*用邻接矩阵构造n个城市间的距离网g*/
inti,j,m,n,k,a,b,c;
vertextypex,y;
printf("inputthenumberofcities(atleast6cities):
");
scanf("%d",&g->vexnum);/*输入城市的个数(图的顶点数)*/
printf("inputthenumberofroads(atleast10roads):
");
scanf("%d",&g->arcnum);/*输入道路的边数(图的边数)*/
printf("inputthenameof%dcities:
",g->vexnum);
for(i=0;ivexnum;i++)
scanf("%s",g->vexs[i]);/*输入城市名称(图的顶点)*/
for(m=0;mvexnum;m++){
for(n=0;nvexnum;n++)
g->arcs[m][n].adj=INFINITY;}/*初始化邻接矩阵*/
for(k=0;karcnum;k++){
printf("inputthedistanceofaroad:
");
scanf("%s%s%d",x,y,&c);/*输入城市间的距离(图中边的起点和终点及权值)*/
a=locatedvex(*g,x);
b=locatedvex(*g,y);
while(a==-1||b==-1){
printf("thenameofthecityiswrong!
\n");
printf("inputthedistanceofaroadagain:
");
scanf("%s%s%d",x,y,&c);
a=locatedvex(*g,x);
b=locatedvex(*g,y);
}
g->arcs[a][b].adj=c;
g->arcs[b][a]=g->arcs[a][b];
}
}
voidprint(mgraphg)/*输出用邻接矩阵构造的n个城市间距离网g*/
{
inti,j;
for(i=0;i{for(j=0;jprintf("%-4d",g.arcs[i][j].adj);
printf("\n");
}
}
voidminispantree(mgraphg,vertextypex){/*从第k个顶点出发构造图g的最小生成树*/
inti,j,t,k,sum=0;
k=locatedvex(g,x);
for(j=0;jif(j!
=k){g.closedge[j].lowcost=g.arcs[k][j].adj;
strcpy(g.closedge[j].adjvex,x);
}
g.closedge[k].lowcost=0;/*初始,U={u}*/
for(i=1;ivexnum-1个顶点*/
k=min(g);/*求出生成树的下一个顶点*/
printf("(%s,%s)%d\n",g.closedge[k].adjvex,g.vexs[k],g.closedge[k].lowcost);/*输出生成树的边和权值*/
sum+=g.closedge[k].lowcost;/*计算最小生成树的代价*/
g.closedge[k].lowcost=0;/*第k顶点并入U集*/
for(t=0;tif(g.arcs[k][t].adjstrcpy(g.closedge[t].adjvex,g.vexs[k]);
g.closedge[t].lowcost=g.arcs[k][t].adj;
}
}
printf("Theshortestdistanceis%d\n",sum);/*输出最小生成树的代价*/
}
intmin(mgraphg){/*在辅助数组g.closedge[i]中选择权值最小的顶点,并返回其位置*/
inti,a=0,min;
min=maxnum;
for(i=1;iif(g.closedge[i].lowcost=0){
a=i;
min=g.closedge[i].lowcost;
}
returna;
}
intlocatedvex(mgraphg,vertextypeu){/*确定任一城市在距离网g中的位置*/
inti;
for(i=0;iif(strcmp(u,g.vexs[i])==0)
returni;
return-1;
}
intmain()
{mgraphg;vertextypeu;intk;
createUDN(&g);/*生成邻接矩阵结构的图*/
printf("\nThegraphis:
\n");
print(g);/*输出邻接矩阵*/
printf("inputthecityyouwanttostart:
");
scanf("%s",u);/*输入最小生成树的起点*/
k=locatedvex(g,u);
while(k==-1){
printf("thenameofthecityiswrong!
\n");
printf("inputthecityyouwanttostartagain:
");
scanf("%s",u);
k=locatedvex(g,u);
}
minispantree(g,u);/*普里姆算法求最小生成树*/
}
5程序运行结果
8心得体会
本次课程设计我们经历了最短时间最繁重的设计任务,作为两人组的课程设计任务难度相对来说较大,我和我的合作伙伴尽了最大的努力来做到课程设计的要求,仍然不是很满意最后的结果。
但是,总的来说也让我们体会到了一些软件开发的辛苦,有时候你确实需要在有限的时间内来完成任务。
最后本次课程任务教给我们很多,让我们客观的正视了自己一个学期的学习成果。
我们相信自己通过这样的任务能学到我们平时仅仅上课所学不到的知识,并发现、体会到了一种经过辛苦编程,纠正代码后所独有的快乐。
也让我们发现了自己对于编程所潜藏的热爱。