景区旅游信息管理系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
校园旅游信息管理系统
项目需求分析
在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游图的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线路策略和制订景区道路铺设策略。
pGraph->Arcs[Stav][Endv]=Weight;
}
printf("\t\t\t创建景区景点分布图成功!!!\n");
printf("\t\t\t按任意键回主菜单!!!");
getch();
returnSUCCESS;
}
输出景区景点分布图
流程图:
程序:
....\n\t");
for(inti=0;i<pGraph->VexNum;i++)
case6:
TopologicalSort(&Graph);
break;
case7:
MinShortPath(&Graph);
break;
case8:
MininumCST(&Graph);
break;
case9:
return0;
default:
break;
}
}
}
intmain()
{
Menu();
return0;
为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组visited[]。
辅助数组visited[]的初始状态为0,在图的遍历过程中,一旦某一个顶点i被访问,就立即让visited[i]为1,防止它被多次访问。
两种图的遍历方法:
深度优先搜索
DFS(DepthFirstSearch)
广度优先搜索
BFS(BreadthFirstSearch)
因此归纳起来,本任务有如下功能模块:
创建景区景点分布图;
输出景区景点分布图(邻接矩阵)
输出导游线路图;
判断导游线路图有无回路;
求两个景点间的最短路径和最短距离;
输出道路修建规划图。
主程序用菜单选项供用户选择功能模块。
项目设计流程
项目数据结构
#ifndefSUCCESS....\n");
printf("\t\t\t请输入图的顶点数(<=20):");
广度优先搜索遍历图(BFS)
对连通图,从起始点V到其余各顶点必定存在路径。
其中,V->w1,V->w2,V->w8的路径长度为1;
V->w7,V->w3,V->w5的路径长度为2;
V->w6,V->w4的路径长度为3
从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。
CreateGraph(&Graph);
break;
case2:
SaveGraph(&Graph);
break;
case3:
ReadGraph(&Graph);
break;
case4:
PrintGraph(&Graph);
break;
case5:
TraverseGraph(&Graph);
break;
2.初始化:Vnew={x},其中x为集合V中的任一节点(起始点),Enew={};
3.重复下列操作,直到Vnew=V:
1.在集合E中选取权值最小的边(u,v),其中u为集合Vnew中的元素,而v则不是(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
2.将v加入集合Vnew中,将(u,v)加入集合Enew中;
总的来说这次系统开发我学到了很多.
任务中景点分布是一个无向带权连通图,图中边的权值是景点之间的距离。
1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路图,导游线路图用有向图表示。遍历采用深度优先策略,这也比较符合游客心理。
(2)为了使导游线路图能够优化,可通过拓朴排序判断图中有无回路,若有回路,则打印输出回路中的景点,供人工优化。
4.输出:使用集合Vnew和Enew来描述所得到的最小生成树。
例如:
流程图:
程序:
建景区景点分布图\n\n");
printf("\t\t\t2.保存景区景点分布图\n\n");
printf("\t\t\t3.读取景区景点分布图\n\n");
printf("\t\t\t4.输出景区景点分布图\n\n");
若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
流程图:
程序:
....\n",pGraph->Vexs[Vertex]);
...\n");
for(intj=0;j<pGraph->VexNum;j++)
{
...\n");
入:一个加权连通图,其中顶点集合为V,边集合为E;
printf("按任意键回主菜单!!!");
getch();
returnSUCCESS;
}
输出景区导游线路图
图的遍历
从图中某一顶点出发访遍图中所有的顶点,且使每个顶点仅被访问一次,这一过程就叫做图的遍历(TraversingGraph)。
图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
(3)在导游线路图中,还为一些不愿按线路走的游客源自文库供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路图中将输出任意景点间的最短路径和最短距离。
(4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。
printf("\t\t\t5.输出景区导游线路图\n\n");
printf("\t\t\t6.导游线路图有无回路\n\n");
printf("\t\t\t7.景点之间的最短路径\n\n");
printf("\t\t\t8.输出道路修建规划图\n\n");
printf("\t\t\t9.退出信息管理系统\n\n");
}
主界面:
创建景区景点分布图:
输出景区景点分布图:
输出景区导游线路图:
有向图的拓扑排序:
求两个景点间的最短路径:
输出道路修建规划图:
项目心得体会
通过本次景区旅游管理系统的开发,我对数据结构的图有了基本的了解.我对图这章的知识有了一个结构的框架,对于一些以前自己从未见过的算法有了一定的了解,并能够自己写出来,这是对我能力的一种提高在编码方面.在开发这个系统时,遇到了很多的难题,例如:求最短路径等比较有难度的算法时不得不上网查大量的资料,结合书本上写的慢慢的理解,这真是一个漫长的过程,可能有时一天也不能弄懂一个算法的本质.我凭着不放弃的心态,最终还是克服了重重困难,解决了自己从未解决过的难题.这也是自己的一个突破.在系统开发的过程中依然有一些本质性的问提没有解决,我现在没有过多的深究,但我相信我会在以后的学习中一一解决这些难题.例如:求顶点之间的最短路径我一直还不懂求PATH数组.
for(intj=0;j<pGraph->VexNum;j++)
if(pGraph->Arcs[i][j]==INF)
printf("∞\t");
else
printf("%d\t",pGraph->Arcs[i][j]);
printf("\n");
}
printf("\t___________________________________________________________\n\t");
在系统开发的过程中我学到了很多的新的知识,最重要的就是学会了一种思想.模块化思想,以前老师总是提到我们以后写代码不必写那么多,拿来用就行,我一直不懂他的意思,原来是当你的模块被集成之后,以后这些模块就可以不必写了可以直接引用.例如:这次我用到了桟和队列的知识,我以前就写过,如果我要是重新去写又得花一定的时间,这并不是一个好的习惯,我以前写过集成了我拿来用不就行了吗,这样提高了编码的速度提高了效率.不过代码重用的考虑很多的东西,要求比较高.
printf("\t\t\t请选择相应功能:");
return0;
}
intMenu()
{
GRAPHGraph;
intSelect;
while(1)
{
system("cls");
Frame();
scanf("%d",&Select);
system("cls");
switch(Select)
{
case1:
scanf("%d",&pGraph->VexNum);
....\n");
for(inti=0;i<pGraph->VexNum;i++)
{
printf("\t\t\t请输入第%d个顶点名称:",i+1);
scanf("%s",pGraph->Vexs[i]);
}
....\n");
printf("\t\t\t请输入弧的信息(注:从0开始):\n");
printf("%s\t",pGraph->Vexs[i]);
printf("\n\n\t景区景点信息......\n");
for(i=0;i<pGraph->VexNum;i++)
{
printf("\t___________________________________________________________\n\t");
for(i=0;i<pGraph->ArcNum;i++)
{
intStav,Endv,Weight;
printf("\t\t\t请输入第%d条弧(格式:ViVjWeight):",i+1);
scanf("%d%d%d",&Stav,&Endv,&Weight);
pGraph->Arcs[Endv][Stav]=Weight;
项目需求分析
在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游图的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线路策略和制订景区道路铺设策略。
pGraph->Arcs[Stav][Endv]=Weight;
}
printf("\t\t\t创建景区景点分布图成功!!!\n");
printf("\t\t\t按任意键回主菜单!!!");
getch();
returnSUCCESS;
}
输出景区景点分布图
流程图:
程序:
....\n\t");
for(inti=0;i<pGraph->VexNum;i++)
case6:
TopologicalSort(&Graph);
break;
case7:
MinShortPath(&Graph);
break;
case8:
MininumCST(&Graph);
break;
case9:
return0;
default:
break;
}
}
}
intmain()
{
Menu();
return0;
为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组visited[]。
辅助数组visited[]的初始状态为0,在图的遍历过程中,一旦某一个顶点i被访问,就立即让visited[i]为1,防止它被多次访问。
两种图的遍历方法:
深度优先搜索
DFS(DepthFirstSearch)
广度优先搜索
BFS(BreadthFirstSearch)
因此归纳起来,本任务有如下功能模块:
创建景区景点分布图;
输出景区景点分布图(邻接矩阵)
输出导游线路图;
判断导游线路图有无回路;
求两个景点间的最短路径和最短距离;
输出道路修建规划图。
主程序用菜单选项供用户选择功能模块。
项目设计流程
项目数据结构
#ifndefSUCCESS....\n");
printf("\t\t\t请输入图的顶点数(<=20):");
广度优先搜索遍历图(BFS)
对连通图,从起始点V到其余各顶点必定存在路径。
其中,V->w1,V->w2,V->w8的路径长度为1;
V->w7,V->w3,V->w5的路径长度为2;
V->w6,V->w4的路径长度为3
从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。
CreateGraph(&Graph);
break;
case2:
SaveGraph(&Graph);
break;
case3:
ReadGraph(&Graph);
break;
case4:
PrintGraph(&Graph);
break;
case5:
TraverseGraph(&Graph);
break;
2.初始化:Vnew={x},其中x为集合V中的任一节点(起始点),Enew={};
3.重复下列操作,直到Vnew=V:
1.在集合E中选取权值最小的边(u,v),其中u为集合Vnew中的元素,而v则不是(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
2.将v加入集合Vnew中,将(u,v)加入集合Enew中;
总的来说这次系统开发我学到了很多.
任务中景点分布是一个无向带权连通图,图中边的权值是景点之间的距离。
1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路图,导游线路图用有向图表示。遍历采用深度优先策略,这也比较符合游客心理。
(2)为了使导游线路图能够优化,可通过拓朴排序判断图中有无回路,若有回路,则打印输出回路中的景点,供人工优化。
4.输出:使用集合Vnew和Enew来描述所得到的最小生成树。
例如:
流程图:
程序:
建景区景点分布图\n\n");
printf("\t\t\t2.保存景区景点分布图\n\n");
printf("\t\t\t3.读取景区景点分布图\n\n");
printf("\t\t\t4.输出景区景点分布图\n\n");
若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
流程图:
程序:
....\n",pGraph->Vexs[Vertex]);
...\n");
for(intj=0;j<pGraph->VexNum;j++)
{
...\n");
入:一个加权连通图,其中顶点集合为V,边集合为E;
printf("按任意键回主菜单!!!");
getch();
returnSUCCESS;
}
输出景区导游线路图
图的遍历
从图中某一顶点出发访遍图中所有的顶点,且使每个顶点仅被访问一次,这一过程就叫做图的遍历(TraversingGraph)。
图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
(3)在导游线路图中,还为一些不愿按线路走的游客源自文库供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路图中将输出任意景点间的最短路径和最短距离。
(4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。
printf("\t\t\t5.输出景区导游线路图\n\n");
printf("\t\t\t6.导游线路图有无回路\n\n");
printf("\t\t\t7.景点之间的最短路径\n\n");
printf("\t\t\t8.输出道路修建规划图\n\n");
printf("\t\t\t9.退出信息管理系统\n\n");
}
主界面:
创建景区景点分布图:
输出景区景点分布图:
输出景区导游线路图:
有向图的拓扑排序:
求两个景点间的最短路径:
输出道路修建规划图:
项目心得体会
通过本次景区旅游管理系统的开发,我对数据结构的图有了基本的了解.我对图这章的知识有了一个结构的框架,对于一些以前自己从未见过的算法有了一定的了解,并能够自己写出来,这是对我能力的一种提高在编码方面.在开发这个系统时,遇到了很多的难题,例如:求最短路径等比较有难度的算法时不得不上网查大量的资料,结合书本上写的慢慢的理解,这真是一个漫长的过程,可能有时一天也不能弄懂一个算法的本质.我凭着不放弃的心态,最终还是克服了重重困难,解决了自己从未解决过的难题.这也是自己的一个突破.在系统开发的过程中依然有一些本质性的问提没有解决,我现在没有过多的深究,但我相信我会在以后的学习中一一解决这些难题.例如:求顶点之间的最短路径我一直还不懂求PATH数组.
for(intj=0;j<pGraph->VexNum;j++)
if(pGraph->Arcs[i][j]==INF)
printf("∞\t");
else
printf("%d\t",pGraph->Arcs[i][j]);
printf("\n");
}
printf("\t___________________________________________________________\n\t");
在系统开发的过程中我学到了很多的新的知识,最重要的就是学会了一种思想.模块化思想,以前老师总是提到我们以后写代码不必写那么多,拿来用就行,我一直不懂他的意思,原来是当你的模块被集成之后,以后这些模块就可以不必写了可以直接引用.例如:这次我用到了桟和队列的知识,我以前就写过,如果我要是重新去写又得花一定的时间,这并不是一个好的习惯,我以前写过集成了我拿来用不就行了吗,这样提高了编码的速度提高了效率.不过代码重用的考虑很多的东西,要求比较高.
printf("\t\t\t请选择相应功能:");
return0;
}
intMenu()
{
GRAPHGraph;
intSelect;
while(1)
{
system("cls");
Frame();
scanf("%d",&Select);
system("cls");
switch(Select)
{
case1:
scanf("%d",&pGraph->VexNum);
....\n");
for(inti=0;i<pGraph->VexNum;i++)
{
printf("\t\t\t请输入第%d个顶点名称:",i+1);
scanf("%s",pGraph->Vexs[i]);
}
....\n");
printf("\t\t\t请输入弧的信息(注:从0开始):\n");
printf("%s\t",pGraph->Vexs[i]);
printf("\n\n\t景区景点信息......\n");
for(i=0;i<pGraph->VexNum;i++)
{
printf("\t___________________________________________________________\n\t");
for(i=0;i<pGraph->ArcNum;i++)
{
intStav,Endv,Weight;
printf("\t\t\t请输入第%d条弧(格式:ViVjWeight):",i+1);
scanf("%d%d%d",&Stav,&Endv,&Weight);
pGraph->Arcs[Endv][Stav]=Weight;