图的最短路径实现 实验报告.docx
《图的最短路径实现 实验报告.docx》由会员分享,可在线阅读,更多相关《图的最短路径实现 实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
![图的最短路径实现 实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/11/6f715748-d181-4000-908c-a6a46fb2dbe4/6f715748-d181-4000-908c-a6a46fb2dbe41.gif)
图的最短路径实现实验报告
数据结构课程设计报告
图的最短路径算法的实现
班级:
计算机112班
姓名:
*****
指导教师:
*****
成绩:
_______________
信息工程学院
2013年1月11日
一、题目描述
1.1题目内容
设计校园平面图,所含景点不少于8个。
以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。
要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。
2.2题目要求
1.从文件graph.txt中读取相应数据,创建一个图,使用邻接矩阵表示图;
2.景点信息查询:
为来访客人提供校园任意景点相关信息的介绍;
3.问路查询:
为来访客人提供校园任意两个景点之间的一条最短路径。
选做内容:
1.修改一个已有景点的相关信息;
2.增加一个新景点及其相关信息;
3.增加一条新的路径;
4.删除一个景点及其相关信息;
5.删除一条路径。
二、设计概要
2.1程序的主要功能
现实校园主要的经典名称;
查询各个经典的信息;
更改景点的信息;
删除某个景点;
2.2数据结构
校园道路是双向通行的,可设校园平面图是一个带权的无向图,用邻接矩阵表示此无向网。
2.3算法分析
Floyd算法
又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。
核心思路
通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
从图的带权邻接矩阵A=[a(i,j)]n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D
(1);又用同样地公式由D
(1)构造出D
(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。
矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
采用的是松弛技术,对在i和j之间的所有其他点进行一次松弛。
算法描述
a) 初始化:
D[u,v]=A[u,v]
b) Fork:
=1ton
Fori:
=1ton
Forj:
=1ton
IfD[i,j]>D[i,k]+D[k,j]Then
D[i,j]:
=D[i,k]+D[k,j];
c) 算法结束:
D即为所有点对的最短路径矩阵
算法过程
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=空值。
定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。
把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j]=min(G[i,j],G[i,k]+G[k,j]),如果G[i,j]的值变小,则D[i,j]=k。
在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
比如,要寻找从V5到V1的路径。
根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5
与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。
三、设计图示
四、详细设计
voidcreat()//从文件中读取景点信息
{
ifstreaminFile;
inFile.open("graph.txt");
intflag=0;
while(inFile>>n>>m)
{
for(inti=1;i<=n;i++)
{
stringtmp;
inFile>>tmp;
g[tmp]=i;
point[i].name=tmp;
inFile>>point[i].intro;
}
for(inti=0;i{
stringu,v;
intkey;
inFile>>u>>v;
inFile>>key;
Map[g[u]][g[v]]=Map[g[v]][g[u]]=key;
}
}
inFile.close();
}
voidsearch()//查找任意两点间的最短路径
{
ints,t;
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
if(i!
=j)
{
if(Map[i][j]==0)
gm[i][j]=INF;
else
gm[i][j]=Map[i][j];
}
elsegm[i][j]=INF;
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
path[i][j]=i;
for(intk=1;k<=n;k++)
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
{
if(gm[i][j]>gm[i][k]+gm[k][j])
{
gm[i][j]=gm[i][k]+gm[k][j];
path[i][j]=path[k][j];
}
}
while
(1)
{
system("cls");
menu();
while
(1)
{
printf("请输入起点:
");
inttmp;
cin>>tmp;
s=tmp;
printf("请输入终点:
");
cin>>tmp;
t=tmp;
if(s<1||s>n||t<1||t>n)
{
printf("\n\n输入错误!
请重新输入!
\n\n");
}
elsebreak;
}
intmpath[MAX];
intcnt=0;
intp=t;
while(p!
=s)
{
mpath[cnt++]=p;
p=path[s][p];
}
mpath[cnt++]=s;
if(gm[s][t]>=INF)printf("没有直达路径!
\n");
else
{
printf("\n最短路径为:
");
for(inti=cnt-1;i>=1;i--)
{
cout<";
}
cout<printf("\t路程为:
%d\n",gm[s][t]);
}
printf("\n是否返回主菜单?
Y/N:
");
charss[10];
scanf("%s",ss);
if(ss[0]=='Y')
{
system("cls");
return;
}
}
}
voiddeletepoint()//删除某一个景点
{
while
(1)
{
if(n==0)
{
printf("没有景点!
");
return;
}
menu();
intkey;
printf("请输入要删去的景点的标号:
");
scanf("%d",&key);
for(inti=1;i<=n;i++)
if(Map[key][i]!
=0)
{
Map[key][i]=Map[i][key]=0;
m--;
}
for(inti=key+1;i<=n;i++)
{
point[i-1]=point[i];
for(intj=1;j<=n;j++)
if(Map[i][j]!
=0&&j!
=key)
{
Map[i-1][j]=Map[j][i-1]=Map[i][j];
Map[i][j]=Map[j][i]=0;
}
g[point[i].name]=i-1;
}
n--;
printf("删除成功!
是否继续删除?
Y/N:
");
charss[10];
scanf("%s",ss);
if(ss[0]=='N')
{
system("cls");
return;
}
}
}
五、调试分析
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。
本系统调试过程中遇到问题、原因和解决方法如下面介绍.
运行完程序一次有错误提醒原因是上次运行程序后没有关闭操作界面当点击编译时会有一个错误提示,解决方法:
将上一次运行时的操作界面关闭。
其原因是指针指向的位置出现错误导致程序传参错乱,无法运行,解决办法:
使程序进入调试状态在传参,出现错误的位置一句句查找传递的参数是否是你所希望的,如若不是就加以修正
时间复杂度
O(
)
优缺点分析
Floyd算法适用于APSP(AllPairsShortestPaths),是一种动态规划算法,稠密图效果最佳,边权可正可负。
此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法。
优点:
容易理解,可以算出任意两个节点之间的最短距离,代码编写简单;
缺点:
时间复杂度比较高,不适合计算大量数据。
六、运行结果
七、心得体会
做一个系统之前还应该做好全面的安排,对一个系统的整个流程及功能实现有一个很好的统筹,在遇到困难时,应查资料或问其它懂的同学,参考一下意见,再结合自己的想法,最后实现自己想实现的功能。
在编写代码的时候要注意摒弃一些不好的习惯,细心地写好每一行代码,采取缩格排版,这样可以避免出现很多不应该出现的错误,也为后面的调试省去了很多环节,不必再为小细节而浪费时间,节省了很多时间。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
参考资料
算法设计与分析(第2版)王晓东编著清华大学出版社
数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社
C语言程序设计谭浩强著清华大学出版社