热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

校园导航系统,生成图,图之间最短路径问题(温习迪杰斯特拉算法,普利姆算法)...

关于图,大家都觉特非常头疼,当你仔细看这个算法,细细品味,只觉得它是小菜一碟,希望给你带来帮助#includ

关于图,大家都觉特非常头疼,当你仔细看这个算法,细细品味,只觉得它是小菜一碟,希望给你带来帮助

#include "stdio.h"
#define Infinity 1000
#define MaxVertexNum 7
#define MAX 20
#include "stdlib.h"
#include "string.h"
typedef struct arcell//边的信息
{
int adj;//权值


}arcell,adjmatrix[MaxVertexNum][MaxVertexNum];
typedef struct vexsinfo//顶点信息
{
int position;//景点的编号
char name[32];//景点名
char introduction[56];//景点的介绍
}vexsinfo;
typedef struct mgraph//使用邻接矩阵实现图的存储
{
vexsinfo vexs[MaxVertexNum];//数组顶点向量,存顶点信息
adjmatrix arcs;//邻接矩阵
int vexnum,arcnum;//顶点数和边数
}mgraph;




int visit[7];//标识dingdian是否访问过
int d[7];//用于存放权值或存储路径顶点编号
mgraph campus;//南阳理工学院校园
mgraph c;






mgraph initgraph()
{
int i=0,j=0;
c.vexnum=5;//顶点是5个
c.arcnum=7;//边 是6条
for(i=0;ic.vexs[i].position=i;
strcpy(c.vexs[0].name,"南阳理工学院大门");
strcpy(c.vexs[0].introduction,"长江路80号");
strcpy(c.vexs[1].name,"南阳理工学院图书馆");
strcpy(c.vexs[1].introduction,"进入学校门口直走50米");
strcpy(c.vexs[2].name,"梦西湖");
strcpy(c.vexs[2].introduction,"建立于2012年,里面有湖和亭子");
strcpy(c.vexs[3].name,"15号宿舍楼");
strcpy(c.vexs[3].introduction,"校车终点站,高7层");
strcpy(c.vexs[4].name,"南苑餐厅");
strcpy(c.vexs[4].introduction,"高两层,饭食可口");
for(i=0;ifor(j=0;jc.arcs[i][j].adj=Infinity;//先初始化图的邻接矩阵
c.arcs[0][1].adj=50;c.arcs[0][4].adj=450;
c.arcs[1][2].adj=150;c.arcs[1][3].adj=180;c.arcs[1][4].adj=200;
c.arcs[2][3].adj=150;
c.arcs[3][4].adj=50;
for(i=0;ifor(j=0;j

c.arcs[i][j].adj=c.arcs[j][i].adj;
return c;
}
void jingdianjieshao(mgraph c)
{
int i;
printf("编号\t景点名称\t\t景点简介\t\t\n");
printf("______________________________________________\n");
for(i=0;iprintf("%-10d%-25s%-80s\n",c.vexs[i].position,c.vexs[i].name,c.vexs[i].introduction);
initgraph(campus);


printf("______________________________________________\n\n\n");
}






void allpath(mgraph c)//查看景点间的路线
{
//求从顶点v0到其余顶点的最短路径p[]及带权长度d[v](最短路径的距离)
//p[][]数组用于存放两顶点间是否有通路标识,如果p[v][w]=1,则w是从v0到v的最短路径上的顶点
//visited[数组用于设置访问标志
int v,w,i,min,t=0,x,v0;//v0为起始景点的编号
int visited[6],d[6],p[6][6];
printf("\n请输入一个起始景点的编号:");
scanf("%d",&v0);
printf("\n\n");
while(v0<0 ||v0>c.vexnum)
{
printf("\n您输入的景点不存在\n");
printf("请重新输入&#xff1a;");
scanf("%d",&v0);
}
for(v&#61;0;v{
visited[v]&#61;0;//初始化各个景点的访问标识
d[v]&#61;c.arcs[v0][v].adj;//v0到各顶点v的权值赋给d[v],arcs是临界矩阵存两景点间的信息
for(w&#61;0;wp[v][w]&#61;0;//初始化数组&#xff0c;各顶点之间的路径全部设置为空
if(d[v]{
p[v][v0]&#61;1;
p[v][v]&#61;1;//各顶点到自己要联通
}
}
d[v0]&#61;0;//自己到自己的权值设置为0
visited[v0]&#61;1;
for(i&#61;1;i{
min&#61;Infinity;
for(w&#61;0;wif(!visited[w])
if(d[w]{
v&#61;w;min&#61;d[w];
}
visited[v]&#61;1;
for(w&#61;0;wif(!visited[w]&&(min&#43;c.arcs[v][w].adj{
d[w]&#61;min&#43;c.arcs[v][w].adj;//修改v0到w的权值d[w]
for(x&#61;0;xp[w][x]&#61;p[v][x];
p[w][w]&#61;1;
}
}
for(v&#61;0;v{
if(v!&#61;v0)
printf("%s",c.vexs[v0].name);//输出景点v0的名称
for(w&#61;0;w{
if(p[v][w] &&w!&#61;v0 && w!&#61;v)//如果w是且不等于v0&#xff0c;则输出该景点
printf("---->%s",c.vexs[v].name);
}
printf("---->%s",c.vexs[v].name);
printf("\n总路线长为%d米:\n\n",d[v]);
}

}






void shotpath_Floyd(mgraph c)//使用费罗伊德算法实现最短路径
{//求各对顶点v和w间的最短路径p[][]及其带权长度d[v][w]&#xff0c;若p[v][w][u]&#61;&#61;1&#xff0c;则u是v到w的当前求得的最短路径上的顶点
int i,j,k,v,u,w,d[7][7],p[7][7][7];
for(v&#61;0;v{
for(w&#61;0;w{
d[v][w]&#61;c.arcs[v][w].adj;//d[v][w]中存放v至w间初始权值
for(u&#61;0;up[v][w][u]&#61;0;
if(d[v][w]{
p[v][w][v]&#61;1;//v是v至w最短路径的顶点
p[v][w][w]&#61;1;//w是v至w最短路径的顶点
}
}
}
for(u&#61;0;u{
//对任意顶点u&#xff0c;试探其是否为v到w最短路jing上的顶点
for(v&#61;0;vfor(w&#61;0;wif(d[v][u]&#43;d[u][w]{
d[v][w]&#61;d[v][u]&#43;d[u][w];//修改v到w的最短路径长度
for(i&#61;0;ip[v][w][i]&#61;p[v][u][i]||p[u][w][i];//如果i是v到u的最短路径上的顶点&#xff0c;或i是u到w的最短路径上的顶点
}
}
printf("\n请输入出发点和目的地编号:");
scanf("%d%d",&k,&j);printf("\n\n");
while(k<0|| k>c.vexnum || j<0 || j>c.vexnum)
{
printf("\n您输入的景点编号不存在!");
printf("\n请重新输入出发点和目的地编号:");
scanf("%d%d",&k,&j);printf("\n\n");
}
printf("%s",c.vexs[k].name);//输出出发点名称
for(u&#61;0;uif(p[k][j][u] && k!&#61;u &&j!&#61;u)//输出最短路径上中间景点名称
printf("%s",c.vexs[k].name);//输出出发点名称
printf("--->%s",c.vexs[u].name);
printf("--->%s",c.vexs[j].name);//输出目的地的名称
printf("\n\n\n总长为%d米\n\n\n",d[k][j]);
}


void main()
{
int yourchoice;
int flag&#61;0;
char w;
campus&#61;initgraph();
printf("\t****************欢迎使用校园导游系统***************\t\t\n\n");
printf("\t 欢迎来到南阳理工学院校园! \n\n");
printf("\t 1.学校景点介绍 2.查看两景点之间的游览路线 \n\n");
printf("\t 3.两景点间的最短路径 4.退出 \n\n");
printf("\t***************************************************\t\t\n");
printf("请输入您的选择:");
scanf("%d",&yourchoice);
while(!(yourchoice&#61;&#61;1||yourchoice&#61;&#61;2||yourchoice&#61;&#61;3||yourchoice&#61;&#61;4))
{
printf("输入选择不正确&#xff0c;请重新输入");
scanf("%d",&yourchoice);
}
switch(yourchoice)
{
case 1:system("cls");jingdianjieshao(campus);break;
case 2:system("cls");allpath(campus);break;//查看景点间的路线
case 3:system("cls");shotpath_Floyd(campus);break;
case 4:system("cls");exit(1);break;
default:break;
}
printf("是否继续&#xff1f;(y/n):");
scanf("%d",&yourchoice);
do
{scanf("%c",&w);
printf("\n");
if(w!&#61;&#39;y&#39;&&w!&#61;&#39;n&#39;)
printf("指令错误,请重新输入\n");
else
flag&#61;1;
}while(flag&#61;&#61;0);
if(w&#61;&#61;&#39;y&#39;)
{ printf("\t****************欢迎使用校园导游系统***************\t\t\n\n");
printf("\t 欢迎来到南阳理工学院校园! \n\n");
printf("\t 1.学校景点介绍 2.查看两景点之间的游览路线 \n\n");
printf("\t 3.两景点间的最短路径 4.退出 \n\n");
printf("\t***************************************************\t\t\n");
printf("请输入您的选择:");
scanf("%d",&yourchoice);
switch(yourchoice)
{
case 1:system("cls");jingdianjieshao(campus);break;
case 2:system("cls");allpath(campus);break;
case 3:system("cls");shotpath_Floyd(campus);break;
case 4:system("cls");exit(1);break;
default:break;
}
}while(w&#61;&#61;&#39;y&#39;);
}




功能图

0&#xff1a;南阳理工学院北门&#xff0c;1&#xff1a;图书馆&#xff0c;2&#xff1a;梦西湖&#xff0c;3代表15号宿舍楼&#xff0c;4&#xff1a;南苑餐厅


需求分析描述

1.设计学校的校园平面图&#xff0c;选取若干个有代表性的经典抽象成一个无向网&#xff0c;以图中顶点表示校内各景点&#xff0c;边上的权值表示校内两景点之间的距离

2.存放景点代号、名称、简介信息供用户查询

3.为来访游客提供图中任意景点间相关的信息供用户查看

4.为来访游客提供图中任意景点间的最短路径

5.用户退出校园导游系统

系统结构设计、

1.功能图见压缩包

2.主界面设计

为了实现校园导游系统各功能的管理&#xff0c;首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能&#xff0c;方便用户用户使用

3.存储结构设计

采用图结构类型&#xff08;mgraph&#xff09;存储抽象校园图的信息&#xff0c;其中&#xff0c;各景点间的邻接关系用图的邻接矩阵&#xff08;adjmatrix&#xff09;存储&#xff0c;景点信息用结构数组&#xff08;vexs

&#xff09;存储&#xff0c;其中每个数组元素是一个结构变量&#xff0c;包含景点编号、景点名称及景点介绍三个变量&#xff1b;图的顶点个数及边的个数由分量vexnumarcnum

示&#xff0c;它们是整形数据&#xff0c;此外&#xff0c;本系统还设置了三个全局变量&#xff1a;visit[]数组用于存储顶点是否被访问的标志&#xff0c;d[]数组用于存放边上的权值或存储

查找路径的编号&#xff1b;campus是一个图结构的全局变量

4.系统功能设计

&#xff08;1&#xff09;学校景点介绍&#xff1a;选取南阳理工学院的5个景点&#xff1a;南阳理工大门&#xff0c;图书馆&#xff0c;梦西湖&#xff0c;15号宿舍楼和南苑餐厅。先对图进行初始化&#xff0c;初始化由函

initpraph&#xff08;&#xff09;实现&#xff0c;依据读入的图的顶点个数和边的个数&#xff0c;分别初始化图结构中图的顶点向量数组和图的邻接矩阵&#xff0c;学校景点介绍由函数

jiandianjieshao&#xff08;&#xff09;实现&#xff0c;用户选择该功能&#xff0c;系统即能输出学校全部景点的信息&#xff0c;包括景点编号、景点名称和景点简介

&#xff08;2&#xff09;产看游览路线&#xff08;提供图中任意景点间相关的信息供用户查看&#xff09;

查看游览路线由函数allpath&#xff08;&#xff09;实现&#xff0c;该功能采用迪杰斯特拉算法实现。用户使用该功能&#xff0c;系统根据用户输入的起始景点编号&#xff0c;求从该景点到其

他路径的最短路径路线和距离

&#xff08;3&#xff09;查询景点间的最短路径

查询最短路径由函数shortpath_floyd()实现&#xff0c;该功能采用费罗伊德算法实现&#xff0c;当用户选用该功能&#xff0c;系统根据用户输入的起始景点编号和目的地编

号&#xff0c;查询任意两个景点之间的最短路径路线和距离

&#xff08;4&#xff09;退出

退出校园导游系统&#xff0c;由exit&#xff08;0&#xff09;函数实现

总结和体会

本导游图系统的功能设计比较简单&#xff0c;有一些更完美的设计没有实现&#xff0c;此导游图系统还有一定的局限性&#xff0c;如果存在只有一条通路的景点&#xff0c;导游图将

无法求得最佳旅游路径。通过这次的课程设计&#xff0c;通过图书馆借书和向学长们的请教&#xff0c;让我对数据结构中定义无向图和创建无向图的理解更加深刻

&#xff0c;不断提升认识&#xff0c;提高编程技巧&#xff0c;借以不断地提高程序设计水平&#xff0c;了解数据结构在编写比较复杂的程序的重要作用&#xff1b;理解了迪杰斯特拉算法和费

罗伊德的原理&#xff0c;但对于其算法的程序编写还是不太明白&#xff1b;学会了在编程序时如何查找错误&#xff0c;如何改错误等等&#xff0c;总体来说&#xff0c;这次自己做得并不好&#xff0c;

没有掌握知识&#xff0c;对数据结构和C语言了解不透彻&#xff0c;设计的程序比较简单&#xff0c;功能不是很完整化&#xff0c;基本上完成了老师的要求&#xff0c;但还是存在一些问题主要

是对课本上的知识了解不够熟悉&#xff0c;浪费了大量时间去熟悉课本。对知识太过死板&#xff0c;不会灵活利用。所以&#xff0c;我决定以后通过图书馆更努力的学习数

据结构知识。









推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 设计模式——模板方法模式的应用和优缺点
    本文介绍了设计模式中的模板方法模式,包括其定义、应用、优点、缺点和使用场景。模板方法模式是一种基于继承的代码复用技术,通过将复杂流程的实现步骤封装在基本方法中,并在抽象父类中定义模板方法的执行次序,子类可以覆盖某些步骤,实现相同的算法框架的不同功能。该模式在软件开发中具有广泛的应用价值。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
author-avatar
happy可乐可爱多_376_874
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有