软件课程设计报告 从某个源点到其余各顶点的最短路径.docx
- 文档编号:10862431
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:19
- 大小:451.75KB
软件课程设计报告 从某个源点到其余各顶点的最短路径.docx
《软件课程设计报告 从某个源点到其余各顶点的最短路径.docx》由会员分享,可在线阅读,更多相关《软件课程设计报告 从某个源点到其余各顶点的最短路径.docx(19页珍藏版)》请在冰豆网上搜索。
软件课程设计报告从某个源点到其余各顶点的最短路径
题目7
从某个源点到其余各顶点的最短路径(难度系数10,全部做出给100分)
主要
内容
1、假设西安、北京、沈阳、武汉4个城市构成小型交通网,4个城市表示图的4个顶点,他们构成了无向连通图。
以北京为源点,求北京到西安的最短路径;求北京到沈阳的最短路径;求北京到武汉的最短路径。
2、学会建立图的邻接表,理解图的基本概念。
3、学会编写DLL函数。
4、根据自己构建的连通图,利用Dijkstra算法求从某个源点到其余各顶点的最短路径。
5、掌握C++编程环境的基本调试方法,熟练使用可视化C++编程工具。
设计
要求
1、上交课程设计的书面材料,要求打印。
包括课程设计任务书、主要内容,源程序,对程序的功能进行客观评价,明确指出自己编写了哪些具体函数。
2、上交电子版源程序,包括邻接表建立程序、Dijkstra算法。
3、自己编写一个求素数函数,把它书写成一个动态链接库形式,并在主函数中调用它。
尝试把自己编写的程序写成动态链接库和静态链接库形式(无需上交),并比较以下三种EXE文件的大小。
A:
调用静态链接库生成的EXE执行文件。
B:
调用动态链接库生成的EXE执行文件。
C:
直接调用函数生成的EXE执行文件。
主要
仪器
设备
计算机一台,安装WindowsXP操作系统、MicrosoftVisualC++6.0、MSDNLibrary。
主要
参考
文献
[1]侯俊杰.深入浅出MFC(第二版)[M].武汉:
华中科技大学出版社,2001.
[2]谭浩强.C程序设计(第二版)[M].北京:
清华大学出版社,1999..
[3]孟彩霞.计算机软件基础[M].陕西:
西安电子科技大学出版社,2003.
[4]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2005.
课程设计进度计划(起止时间、工作内容)
选做最短路径题目的同学,2人1组,1人做Dijkstra算法,1人做Floyd算法,整个课程设计共20学时,具体进度如下:
4学时了解课题背景,选题,学习DLL,学习图的基本概念。
4学时编写邻接表建立程序。
4学时Floyd算法。
4学时尝试利用Floyd算法求任意两个顶点之间的最小距离。
4学时调试程序,答辩。
课程设计开始日期
第3周周二
课程设计完成日期
第7周周二
课程设计实验室名称
计算中心机房
地点
健翔桥校区
摘要
本次课程设计的问题:
假设西安、北京、沈阳、武汉4个城市构成小型交通网,4个城市表示图的4个顶点,它们构成了无向连通图。
以北京为源点,求北京到西安的最短路径;求北京到沈阳的最短路径;北京到武汉的最短路径。
本次课程设计中应用Floyd算法求最短路径。
通过一个图的权值矩阵求出它的每两点间的最短路径矩阵,从图的带权邻接矩阵A=[a(i,j)]n×n开始,递归地进行n次更新,按一个公式,构造出矩阵D
(1),又用同样地公式由D
(1)构造出D
(2)…最后又用同样的公式由D(n-1)构造出矩阵D(n)。
矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
本次试验可以进行有向和无向的计算,不同城市之间的距离由开始进行输入,最后显示两个城市之间的最短路径。
一、应用弗洛伊德(Floyd)算法计算最短路径
假设西安、北京、沈阳、武汉4个城市构成小型交通网,4个城市表示图的4个顶点,他们构成了无向连通图。
以北京为源点,求北京到西安的最短路径;求北京到沈阳的最短路径;求北京到武汉的最短路径。
二、弗洛伊德(Floyd)算法的基本思想
Floyd算法是通过权矩阵计算来实现的一种方法,其主要思想是从代表任意两个节点vi到vj的距离的带权邻接矩阵D(0)开始,首先计算D
(1),即计算vi到vj的距离。
经过一次经转的所有可能路径,经过比较后选出最短路,代替D(0)中对应的路径,迭代列出距离矩阵D
(1),D
(1)中各元素表示通过一次迭代后网络中任意两点间最短路,也即网络中任意两点之间直接到达或只经过一个中间点时的最短路。
在此基础上依次计算D
(2),D(3),…,D(k),D(k)中对应的元素表示任意两点间不经过中间点或最多允许经过2k-1个中间点时的最短路。
当D(k+1)=D(k)时,表明得到的带权邻接矩阵D(k)就反映了所有顶点对之间的最短距离信息,,成为最短距离矩阵。
三、floyd算法函数
四、基本流程
Floyd采用动态规划余力和逐步优化激素和,对有向带权图G=(V,E)设计出求每对定点见最短路径的方法。
该刚发使用邻接矩阵表示有向带权图G,有向图中的n个顶点从1开始编号。
初始时,用邻接矩阵adges存储有向图G,即顶点i到j的最短路径长度adges[i][j]就是弧所对应的权值,它表示任意顶点对之间不经过任何中间顶点的最短路径和长度。
要求顶点i到j记得最短路径长度,对每一对顶点的路径进行比较存储的试探,累加递归后产生一个n阶路径矩阵序列A,算法结束时,从该矩阵可以查找到i到j的最短路径上的所有点。
voidpathchange(inti,intj,intk)//路径处理函数
{
intm,n,p,q;
for(m=0;m { path[i][j].distance[m]=-1; }//首先将其初始化 计算两点之间的距离 for(q=0;q { if(path[i][k].distance[q]! =-1) { m++; } else { break; } }//获取path[i][k]的长度为m for(q=0;q { if(path[k][j].distance[q]! =-1) { n++; } else { break; } }//获取path[k][j]的长度为n 五、功能实现 1、设定ABCD四个城市,之间全连通,无向。 结果如下: 输入: 结果: 2、设定ABCD四个城市、之间为非全连通,无向。 输入: 结果: 3、设定ABCD四个城市、全连通,有向 输入: 结果: 4、设定ABCD四个城市、非全连通、有向。 输入: 结果: 5、ABCD四个城市,A、C之间的最短距离是ABC 截图如下: 代码: extern"C"_declspec(dllexport)intsushu(intn) {inti; for(i=2;i if(n%i) return1; elsereturn0;} #include"stdafx.h" extern"C"_declspec(dllimport)intsushu(inti); intmain(intargc,char*argv[]) { inti=1,m; printf("输入的数字为: "); scanf("%d",&m);printf("素数有: \n"); while(i+1<=m) { i++; if(sushu(i)) printf("%d\t",i); } return0; } 截图如下: 七、心得体会 参考文献 源代码: #include"stdio.h" #definemax100 structplace { charname[max]; } pla[max];//地域名称 structpath { intdistance[max]; } path[max][max];//行进路线 inta[max][max]={0}; voidpathchange(inti,intj,intk)//路径处理函数 { intm,n,p,q; for(m=0;m { path[i][j].distance[m]=-1; }//首先将其初始化 m=0; n=0; for(q=0;q { if(path[i][k].distance[q]! =-1) { m++; } else { break; } }//获取path[i][k]的长度为m for(q=0;q { if(path[k][j].distance[q]! =-1) { n++; } else { break; } }//获取path[k][j]的长度为n for(p=0;p { path[i][j].distance[p]=path[i][k].distance[p];//将path[i][k]的内容转到path[i][j]中去 } for(p=0;p { path[i][j].distance[p+m]=path[k][j].distance[p];//将path[k][j]的内容转到path[i][j]中去 } } voidcin(int*p)//赋值和路线函数初始化函数 { printf("请输入城市的个数(大于二)\n"); scanf("%d",p); while(*p<=2) { printf("输入值不合法请重新输入\n"); scanf("%d",p); } inti=0,j=0,k=0; for(i=0;i { for(j=0;j { a[i][j]=0; } } for(i=0;i<*p;i++) { for(j=0;j<*p;j++) for(k=0;k { if(k==0) { path[i][j].distance[k]=i; } else { if(k==1) { path[i][j].distance[k]=j; } else path[i][j].distance[k]=-1; } } } } voidbegin(intn,intchoo)//初始化函数2 { inti=0,j=0; for(i=1;i<=n;i++) { printf("请输入第");printf("%d",i);printf("个城市的名字\n"); scanf("%s",pla[i-1].name); } for(i=0;i { for(j=0;j {if(i==j) { a[i][j]=0; } else{ switch(choo) { case1: printf("请输入");printf("%s",pla[i].name);printf("到"); printf("%s",pla[j].name);printf("的距离(不通请输入-1)\n"); scanf("%d",&a[i][j]);break; case2: if(j>i) { printf("请输入");printf("%s",pla[i].name);printf("到"); printf("%s",pla[j].name);printf("的距离(不通请输入-1)\n"); scanf("%d",&a[i][j]); }break; } } } } if(choo==2) { for(i=0;i { for(j=0;j { a[j][i]=a[i][j]; } } } } voidfloyd(intn)//floyd算法函数 { inti=0,j=0,k=0; for(k=0;k { for(i=0;i { for(j=0;j { if(a[i][j]>a[i][k]+a[k][j]) { if(a[i][k]! =-1&&a[k][j]! =-1) { a[i][j]=a[i][k]+a[k][j]; pathchange(i,j,k); } } } } } } intchoose() { intnum,num_check; printf("请选择两城市间是有向图还是无向图\n"); printf("1-------------有向(城市间来回距离可以不一样)\n"); printf("2-------------无向(城市间来回距离完全一样)\n"); scanf("%d",&num); while(num! =1&&num! =2) { printf("输入值不合法请重新输入\n"); scanf("%d",&num); } if(num==1) { printf("您已经选择有向图! \n"); } else { printf("您已经选择无向图! \n"); } returnnum; } voidmain() { intn=0,t=1; while(t) {intchoo=0; choo=choose(); cin(&n); begin(n,choo); floyd(n); print(n,&t,&n); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件课程设计报告 从某个源点到其余各顶点的最短路径 软件 课程设计 报告 某个 源点 其余 顶点 路径