网络光纤铺设的最佳方案选择教材.docx
《网络光纤铺设的最佳方案选择教材.docx》由会员分享,可在线阅读,更多相关《网络光纤铺设的最佳方案选择教材.docx(15页珍藏版)》请在冰豆网上搜索。
网络光纤铺设的最佳方案选择教材
广东海洋大学信息学院
课程设计报告
设计题目
网络光纤铺设的最佳方案选择
课程名称
数据结构
姓名(学号)
联系电话
专业名称
计算机科学与技术
所在班级
计科1111班
指导教师
谢仕义
教师职称
教授
起止时间
2011年12月26日至2012年1月6日
评定成绩
一、课程设计的主要内容
需要在某个城市n个居民小区之间铺设网络光纤,假设任意两个居民小区之间均需要铺设光纤,则在这n个居民小区之间只需要铺设n-1条光纤即可形成一个网络,但由于地理环境不同,所需要的代价也不尽相同。
本课程设计要求事先随机生成任意居民小区之间铺设网络光纤的代价,并将代价存入文件,然后设计一个最佳方案进行光纤铺设,使得既能连通所有小区之间的网络,又能使网络光纤铺设的代价最小,最终以图形形式输出所设计的最佳方案。
二、功能和结构设计
1.普里姆算法分析
1普里姆算法思想
普利姆算法的思想是:
在图中人去一个定点k0作为开始点,令U={k0},W=V-U,其中V为图中所有顶点集,然后找一个顶点在U中,另一个顶点在w中的边中最短的一条,找到后,将该边作为最小生成树的树边保存起来,并将该边顶点全部加入U集合中,并从W中删除这些顶点,然后重新调整U中顶点到W中顶点的距离,使之保持最小,再重复此过程,直到W为空集。
2改算法过程描述
a.在图G=(V,E)(V是顶点,E是边)中,从集合V中任取一个顶点,如k0放入集合U中,这时,U={k0},集合T(E)为空。
b.从k0出发寻找与U中顶点相邻权值最小的边的另一顶点k1,并使k1加入U。
即U={k0,k1},同时将该边加入集合T(E)中。
c.重复
(2),直到U=V为止。
d.这时T(E)中有n-1条边,T=(U,T(E))就是一一颗最小生成树。
2.模块分析
根据对模型的功能分析,该管道铺设设计可以具有以下功能:
1.网络光纤铺设信息的输入;
2.最小生成树信息的输出;
下面我们给出相应的功能模块图:
3.抽象数据类型分析
areanum居民区总数(顶点总数);
edgenum边的总数;
date[][20]邻接矩阵存储图结构;
s边的权值;
short-way[i]居民区i到目前生成树中所有点集U中某个居民区的路程最小值
near-area[i]U中能使其最小的居民区
4.功能分析
假设居民区分布和各居民区之间的距离如下图显示
则通过网络光纤铺设的最佳方案选择后结果如下面显示
程序开始
信息输入
输出结果
三、流程图和算法设计
1.详细算法分析
1信息输入模块
//输入顶点个数和边的条数
cout<<"请输入居民区个数:
";
cin>>areanum;
cout<cout<<"请输入网络光纤铺设路线的总条数:
";
cin>>edgenum;
//初始化矩阵各元素值
inti,j,k;
for(i=0;ifor(j=0;jdate[i][j]=INFINITY;
//读入边
intfrom,to,s;
cout<<"请按此格式输入边和权值:
i,j,k(表示i居民区到j居民区的距离为k米)";
for(i=0;i{
cin>>from>>to>>m;
date[from][to]=s;
date[to][from]=st;
}
//输出邻接矩阵
for(i=0;i{
for(j=0;j{
cout<}
cout<}
②建立最小生成树并输出结果
voidprim(intdate[][MAXNODE],intareanum,intnear_area[])
{
//辅助数组short_way,near_area
//short_way[i]表示居民区i到到目前生成树中所有点集U中某个居民区(点)的路程最小值
//near_city[i]表示U中能使其最小的居民区(点)
intshort_way[areanum];
intmin;inti,j,k;
//0已经放入U中
//初始化short_way和near_area
for(i=1;i{
short_way[i]=date[0][i];near_area[i]=0;
}
short_way[i]=0;near_area[0]=0;
for(i=1;i//有n-1条边要加入生成树,所以只要循环n-1次即可
{
min=INFINITY;
//求生成树外顶点到生成树内顶点具有最小权值的边
j=1;k=1;
while(j//确定当前具有最小权值的边及位置
{
if(short_way[j]!
=0&&short_way[j]{
min=short_way[j];
k=j;
}
j++;
}
cout<<"这"<"<
short_way[k]=0;
for(j=0;j{
if(date[k][j]{
short_way[j]=date[k][j];
near_area[j]=k;
}
}
}
2.程序流程图
Y
N
Y
N
Y
N
ii++
j++
输出邻
接矩阵
j=0
jii=0
i=1
i++
+++
Short_way[i]=data[0][i]
near_area[i]=0
i=1
Y
Y
Y
Y
Y
N
N
N
N
N
i++
j++
j=1,k=1,min=INFINITY
date[k][j]jshort_way[j]!
=0&&
short_way[j]ji输出min
short_way[k]=0;j=0
min=short_way[j];k=j
j++
short_way[j]=date[k][j];
near_area[j]=k;
结束
四、源程序代码
#include
#include
#defineINFINITY9999
voidmain()
{
inta1;
for(a1=0;a1<25;a1++)
cout<<"";
cout<<"网络光纤铺设的最佳方案选择"<for(a1=0;a1<21;a1++)
cout<<"";
for(a1=0;a1<34;a1++)
cout<<"*";
cout<for(a1=0;a1<21;a1++)
cout<<"";
cout<<"**"<for(a1=0;a1<21;a1++)
cout<<"";
cout<<"*欢迎使用本程序,希望本程序可以*";
cout<for(a1=0;a1<21;a1++)
cout<<"";
cout<<"*帮您选择最佳铺设方案*";
cout<for(a1=0;a1<21;a1++)
cout<<"";
cout<<"**";
cout<for(a1=0;a1<21;a1++)
cout<<"";
for(a1=0;a1<34;a1++)
cout<<"*";
cout<intdate[20][20];
intareanum;
intedgenum;
cout<cout<<"请输入居民区个数:
";
cin>>areanum;
cout<cout<<"请输入网络光纤铺设路线的总条数:
";
cin>>edgenum;//初始化矩阵个元素值
inti,j;
for(i=0;ifor(j=0;jdate[i][j]=INFINITY;//读入边
intfrom,to,m;
cout<cout<<"请按此格式输入边和权值:
i,j,k(表示i居民区到j居民区的距离为k米)";
cout<for(i=0;i{
cin>>from>>to>>m;
date[from][to]=m;
date[to][from]=m;
}//输出邻接矩阵
cout<cout<<"输出邻接矩阵如下面显示";
cout<for(i=0;i{
for(j=0;j{
cout<}
cout<}//prim();
//辅助数组short_way,near_area
//short_way[i]表示居民区i到目前目前生成树中所有点集U中某个居民区的最小路程
//near_area[i]表示U中能使其最小的居民区
intshort_way[20];
intnear_area[20];
intmin;
intk,s,price;
//0已存入U中
//初始化hort_way和near_area
for(i=1;i{
short_way[i]=date[0][i];
near_area[i]=0;
}
short_way[i]=0;
near_area[0]=0;
s=0;
cout<cout<<"从居民区0出发"<for(i=1;i{
min=INFINITY;//求生成树外顶点到生成树内顶点具有最小权值的边
j=1;k=1;
while(j{
if(short_way[j]!
=0&&short_way[j]{
min=short_way[j];
k=j;
}
j++;
}
cout<<"从居民区"<"<short_way[k]=0;
s+=min;
for(j=0;j{
if(date[k][j]{
short_way[j]=date[k][j];
near_area[j]=k;
}
}
}
cout<cout<<"这"<"<
cout<cout<<"请输入单位长度的价格(元):
";
cin>>price;
cout<cout<<"所以,这"<"<
cout<cout<<"谢谢您的使用!
"<cout<cout<<"本程序编写者:
杨汛、杨阳、卢路路"<cout<}
五、课程设计总结
经过两个星期的不懈努力,数据结构课程设计终于落幕。
我这次的课程设计的题目是《网络光纤铺设的最佳方案选择》,即使用普里姆算法得到所需要的最小的生成树。
在整个设计过程中,自己从刚开始简单的构思算法思路的大致框架,直到最后使得整个算法顺利的得以实现。
期间遇到的问题、错误多不甚数,然经过无数次的调试分析,最终一一得以圆满解决。
在这两个星期里,自己可谓是感慨万分。
的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是自己却能够在这短短的两个星期里学到很多很多的的东西,不仅可以巩固了以前所学过的知识,加深了对课本知识点的理解。
而且学到了很多在书本上所没有学到过的知识,能够说是收获颇丰。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从实践中验证理论,从而提高自己的实际动手能力和独立思考的能力。
当然,在设计的过程中遇到许许多多的问题,可以说得是困难重重,毕竟这是一次课程设计,需要掌握的知识面比较广,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。
在设计中,vc++6.0使用的也更加的牢固,了解的也更加深刻。
这次课程设计已经结束了,对于我自己,对本次课程设计我的感受很深,在这个过程中,我也曾经因为实践经验的缺乏失落过,也为毫无头绪而烦恼,也曾经为调试的成功实现而手舞足蹈。
呵呵,让自己在本次课程设计中感受了一番大起大落,使自己从中明白了,做成功一件事,是需要付出和汗水的。
天下无难事只怕有心人,只要自己坚定信念,成功也只在咫尺之间。
当然,我们也不能满足于现有的水准,否则就会停滞不前,要知道学海无涯,仍需我们努力学习。
所以,在以后的时间里,我会利用更多时间去上机实验,加强自学的能力,多编写程序,相信不久后我的编程能力会有所提高能设计出更多的更有创新的作品!
六、参考资料
1.胡明《数据结构》(C++版)清华大学出版社
2.张勇《C++语言程序设计教程》(第二版)清华大学出版社