图的操作和应用之景区信息管理系统(数据结构课程设计)

0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设计)

现有一个景区,景区里面有若干个景点,景点之间满足以下条件:
(1) 某些景点之间铺设了道路(相邻)
(2) 这些道路都是可以双向行驶的(无向图)
(3) 从任意一个景点出发都可以游览整个景区(连通图)

开发景区信息管理系统,对景区的信息进行管理。使用图的数据结构来保存景区景点信息,为用户提供创建图、查询景点信息、旅游景点导航、搜索最短路径、铺设电路规划等功能。



前言

数据结构是计算机学科实践性很强的一门核心课程。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C/C++/Java程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。

一、设计要求

1.景区信息路线图

景区路线图
景区信息

2.设计要求

(1) 读文件创建图
输入:从Vex.txt文件中读取景点信息,从Edge.txt文件中读取道路信息。
处理:根据读取的景区信息创建景区景点图。

(2) 查询景点
输入:想要查询的景点的编号。
处理:根据输入的景点编号,查询该景点及相邻景点的信息。
输出:
① 景点名字
② 景点介绍
③ 相邻景区的名字
④ 到达相邻景区的路径长度

(3) 旅游景点导航
输入:起始景点的编号。
处理:使用深度优先搜索(DFS)算法,查询以该景点为起点,无回路游览整个景区的路线。
输出:所有符合要求的导航路线。

(4) 搜索最短路径
输入:
① 起始景点的编号
② 终点的编号。
处理:使用迪杰斯特拉(Dijkstra)算法,求得从起始景点到终点之间的最短路径,计算路径总长度。
输出:
① 最短路线
② 路径总长度

(5) 铺设电路规划
处理:根据景区景点图使用普里姆(Prim)算法构造最小生成树,设计出一套铺设线路最短,但能满足每个景点都能通电的方案。
输出:
① 需要铺设电路的道路
② 每条道路铺设电路的长度
③ 铺设电路的总长度

(6) 修改图保存文件
插入、删除、修改顶点、边的信息,注意顶点和边的关系,之后保存文件,重新读取文件建立图的存储结构并显示。
重点注意顶点和边的关系,考虑边是否重复?顶点是否存在?……

二、关键代码

1.类的设计

点的类 Node.h:

#ifndef NODE_H_INCLUDED
#define NODE_H_INCLUDED
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

class Node
{
public:
    bool visited;
    Node(int number=-1,string name=" ",string introduction=" ");
    int m_number;
    string m_name;
    string m_introduction;
    //void SeekNode(int number);
};

#endif // NODE_H_INCLUDED

边的类 Edge.h:

#ifndef EDGE_H_INCLUDED
#define EDGE_H_INCLUDED
#include <iostream>

class Edge
{

public:
    Edge(int nodeIndexA=0,int nodeIndexB=0,int weightValue=0);
    int m_iNodeIndexA;
    int m_iNodeIndexB;
    int m_iWeightValue;
    bool m_bSelected;

};

#endif // EDGE_H_INCLUDED

图的类 Map.h:

#ifndef MAP_H_INCLUDED
#define MAP_H_INCLUDED
#include <vector>
#include "Node.h"
#include "Edge.h"
using namespace std;

class Map
{
public:
    Map(int capacity);
    ~Map();
    bool addNode(Node *pNode);// 向图中添加顶点

    void resetNode();//重置顶点
    bool setValueToMatrixForUndirectedGraph(int row,int cli,int val=1);//设置邻接矩阵

    void printMatrix();//打印邻接矩阵
    void DFS(int nodeIndex,int beginNum);//深度优先遍历

    void seekNode(int number);//查询景点
    void mapDFS(int nodeIndex);//旅游景点导航
    void primTree(int nodeIndex);//普利姆算法生成树
    void Dijkstra(int v0,int v1);//迪杰斯特拉算法
    bool hasNode(string nodeName);
    bool hasEdge(int NodeAnum,int NodeBnum);

private:
    bool getValueFromMatricx(int row,int col,int &val);//从矩阵中获取权值
    void breadthFirstTraverseImpl(vector <int> preVec);//广度优先遍历实现函数

    int getMinEdge(vector<Edge> edgeVec);
private:
    int m_iCapacity;//最多可以容纳的顶点数
    int m_iNodeCount; //已经添加的顶点个数
    Node *m_pNodeArray;//用来存放顶点数组
    int *m_pMatrix; //用来存放邻接矩阵
    Edge *m_pEdge;//用来存放边数组


};

#endif // MAP_H_INCLUDED

2.重要算法

迪杰斯特拉(Dijkstra)算法函数:

void Map::Dijkstra(int v0,int v1)
{
    int dist[m_iCapacity];
    int path[m_iCapacity];
    bool final[m_iCapacity];

    dist[v0]=0;
    path[v0]=v0;

    for(int i=1;i<m_iCapacity;i++)
    {
      if(m_pMatrix[v0*m_iCapacity+i]!=0)
      {
      dist[i]=m_pMatrix[v0*m_iCapacity+i];
      }
      else
      {
      dist[i]=100000;
      }
      path[i]=v0;
      final[i]=false;
    }

	for(int i=0;i<m_iCapacity;i++)
        {
		int minds=100000;
		int ind=10000;
		for(int j=0;j<m_iCapacity;j++){//寻找目前的路径距离中最小的一个
			if(!final[j]&&dist[j]<minds){
				minds=dist[j];
				ind=j;
			}
		}

		final[ind]=true;
		for(int j=0;j<m_iCapacity;j++)
		 {//更新dist
           if(m_pMatrix[ind*m_iCapacity+j]!=0&&!final[j]&&(minds+m_pMatrix[ind*m_iCapacity+j])<dist[j])
            {
              dist[j]=minds+m_pMatrix[ind*m_iCapacity+j];
              path[j]=ind;
            }
		 }
	   }
    //路线规划 倒置的
    int endNum=v1;
    vector <int> ewayNum;

   while(1)
    {
      if(path[endNum]!=v0)
        {
         ewayNum.push_back(endNum);
         endNum=path[endNum];

        }
      if(path[endNum]==v0)
      {
          ewayNum.push_back(endNum);
          break;
      }
    }

   //转换成正置路线
    int wayNum[ewayNum.capacity()];
    for(int i=0;i<(int)ewayNum.capacity();i++)
    {
        wayNum[i]=ewayNum[ewayNum.capacity()-1-i];
    }

    //输出正置路线
    cout<<v0<<endl;
    for(int i=0;i<(int)ewayNum.capacity();i++)
    {
        cout<<wayNum[i]<<endl;
    }

    cout<<dist[v1]<<endl;
}

普利姆(Prim)算法函数:

void Map::primTree(int nodeIndex)
{
    int AllWeightValue=0;
    int value=0;
    int edgeCount=0;
    vector <int> nodeVec;
    vector <Edge> edgeVec;
    //cout<<m_pNodeArray[nodeIndex].m_name<<endl;
    nodeVec.push_back(nodeIndex);
    m_pNodeArray[nodeIndex].visited=true;

    while(edgeCount<m_iCapacity-1)
    {
        int temp=nodeVec.back();
        for(int i=0;i<m_iCapacity;i++)
        {
            getValueFromMatricx(temp,i,value);
            if(value!=0)
            {
                if(m_pNodeArray[i].visited)
                {
                    continue;
                }
                else
                {
                    Edge edge(temp,i,value);
                    edgeVec.push_back(edge);
                }
            }
        }
     //从可选边集合中选出最小边
      int edgeIndex=getMinEdge(edgeVec);
      edgeVec[edgeIndex].m_bSelected=true;

      cout<<edgeVec[edgeIndex].m_iNodeIndexA<<"---"<<edgeVec[edgeIndex].m_iNodeIndexB<<" ";
      cout<<edgeVec[edgeIndex].m_iWeightValue<<endl;
      AllWeightValue+=edgeVec[edgeIndex].m_iWeightValue;
      m_pEdge[edgeCount]=edgeVec[edgeIndex];
      edgeCount++;

      int nextNodeIndex=edgeVec[edgeIndex].m_iNodeIndexB;

      nodeVec.push_back(nextNodeIndex);
      m_pNodeArray[nextNodeIndex].visited=true;
     // cout<<m_pNodeArray[nextNodeIndex].m_introduction<<endl;
    }
    cout<<AllWeightValue<<endl;
    for(int j=0;j<m_iCapacity-1;j++)
    {
        m_pNodeArray[j].visited=false;
    }
}

三、运行截图

1.主界面

在这里插入图片描述

2.输出邻接矩阵

在这里插入图片描述

3.查询景点

在这里插入图片描述

4.旅游景点导航(路径搜索)

在这里插入图片描述

5.搜索最短路径(迪杰斯特拉算法)

在这里插入图片描述

6.铺设电路规划(普利姆算法求最小生成树)

在这里插入图片描述

7.动态操作(对景点或者边增删改)

在这里插入图片描述

资源学习与下载

CSDN下载:C++语言 景区信息管理系统(数据结构课程设计 图的操作与应用)(codeblocks版本代码资源)

CSDN下载:C++语言 景区信息管理系统(数据结构课程设计 图的操作与应用 vs版本)(vs版本代码资源)

CSDN下载:课设任务书与报告 景区信息管理系统(数据结构课设 图的操作与应用)(课设任务书以及课设报告)

联系作者

如需要本资源下载也可以直接添加作者QQ,并可以获取资源预览、软件安装、工程导入、协助运行、算法解释、报告协助撰写等售后服务

随时在线,欢迎交流

QQ:2215991436(心源易码 派大星)
备用QQ:402501817(心源易码 佩奇)

  • 8
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线路策略和制订景区道路铺设策略。 任务中景点分布是一个无向带权连通中边的权值是景点之间的距离。 (1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路,导游线路用有向表示。遍历采用深度优先策略,这也比较符合游客心理。 (2)为了使导游线路能够优化,可通过拓朴排序判断中有无回路,若有回路,则打印输出回路中的景点,供人工优化。 (3)在导游线路中,还为一些不愿按线路走的游客提供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路中将输出任意景点间的最短路径和最短距离。 (4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。 归纳起来,本任务有如下功能模块:(1)创建景区景点分布;(2)输出景区景点分布(邻接矩阵)(3)输出导游线路;(4)判断导游线路有无回路;(5)求两个景点间的最短路径和最短距离;(6)输出道路修建规划。(7)主程序用菜单选项供用户选择功能模块。  
景区信息管理系统一个操作应用的实际应用案例,基于Java版数据结构课程设计。在该系统中,被用来表示景区景点之间的关系,并被应用于实现以下功能: 1. 景点的查询:用户可以输入景点的名称或编号来查询景点的详细信息,包括该景点的名称、编号、简介、相关片等。 2. 最短路径的查询:用户可以输入起点和终点景点的名称或编号,来获取从起点到终点的最短路径,包括需要经过的景点、路径长度、路线描述等。 3. 景点推荐:系统可以根据用户所在的位置和用户已经游览过的景点,推荐其他相关的景点,提高用户的游览体验。 4. 景点游览计划的生成:用户可以输入游览时间和游览偏好,系统会根据用户的选择推荐适合的景点游览计划,包括需要游览的景点、开放时间、游览时长等。 以上功能的实现离不开操作应用,例如: 1. 景点的查询:系统中维护了一个景点邻接表,通过的遍历算法可以实现对景点的查询、排序和过滤。 2. 最短路径的查询:系统使用了Dijkstra最短路径算法,通过的邻接表和堆实现了高效的路径查询。 3. 景点推荐:系统通过深度遍历和贪心算法,得到用户所在位置附近的景点,并通过求解最短路径和景点相关性计算,推荐用户相关的景点进行游览。 4. 景点游览计划的生成:系统使用了遗传算法,根据用户的游览时间和偏好推荐出优质的游览计划,并通过的邻接表计算游览时间和路径长度等参数,保证游览计划的有效性和高效性。 通过这些功能的实现,景区信息管理系统可以为用户提供高效、便捷、个性化的旅游服务,为景区管理和推广提供更多的技术支持和数据依据。同时,该系统也为操作应用提供了一个实际的应用案例和代码实现,具有一定的学术和实用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中杯可乐多加冰

请我喝杯可乐吧,我会多加冰!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值