文章目录

  • 存储结构
  • 景点信息查询
  • 遍历整个景区
  • 最短路径
  • 最小生成树

存储结构

采用邻接表保存图的信息,从文本文件中读取相关点的信息,构建邻接表。
文本文件信息保存顺序:第一个int型数字,保存当前点数(V0 还是V1)。第二个字符,保存顶点名称(A或者B)。此处理论上应该可以保存一个字符串,因为在设计时,使用string类型存储。第三个int型数据,保存当前景点票价。第四个int型数据,保存当前顶点和其他顶点存在多少条边,便于在后序构建邻接表时,知道需要循环几次。此后每个数据,依次是和该顶点相关联的顶点的坐标,两者之间的权值。

例如:0 A 100 2 1 5 5 8

表示该顶点是下标为0的顶点,名字为A,票价100¥,与之相连的有两个顶点,分别是下标为1、权值为5和下标为5、权值为8的顶点。

数据结构设计

1. 顶点结构设计

typedef struct VertexNode{string data;int money;EdgeNode *First;
}VertexNode;

2. 边结构设计

typedef struct EdgeNode{int vertex;int weight;struct EdgeNode *next;
}EdgeNode;

3.类设计

class Graph {
private://顶点数组VertexNode G[numVertex];//保存遍历时已经遍历过的顶点bool visited[numVertex];//深度优先递归算法void Dfs(const int n,string &s);
public:Graph();~Graph();//获取图的顶点VertexNode getVertex(const int n);//获得图的顶点和边void createGraph();//深度遍历string DfsTraverse(const int a);//最短路径void shortestPath(const int V1,const int V2,QTextEdit* T);//最小生成树void minimumSpanningTree(QTextEdit* T);
};

读取函数

void Graph::createGraph()
{ifstream ifs;int Vertex = 0;string s;ifs.open(R"(D:\CLion\Graph\graph.txt)",ios::in);if(ifs.is_open()){int edges = 0;for (int i = 0;i < numVertex;i++) {ifs >> Vertex;                           //读取顶点下标ifs >> G[Vertex].data;                   //读取顶点名称 (A、B...)ifs >> G[Vertex].money;                  //读取票价ifs >> edges;                            //读取边数//读取边的信息EdgeNode *e = (EdgeNode*)malloc(sizeof (EdgeNode));ifs >> e->vertex;ifs >> e->weight;G[Vertex].First = e;EdgeNode *p = e;for (int j = 1;j < edges;j++) {auto *e = (EdgeNode*)malloc(sizeof (EdgeNode));ifs >> e->vertex;ifs >> e->weight;e->next = nullptr;p->next = e;p = e;}cout << endl;}}else{cout << "The File is not found!!!" << endl;}ifs.close();}

景点信息查询

景点信息查询实现较为简单,通过输入点的下标,返回对应的顶点的信息
QInputDialog 可以自行百度,此处不多加赘述。

void MainWindow::on_pushButton_2_clicked()
{bool OK = true;int n = QInputDialog::getInt(this,"","please input number",1,1,9,1,&OK);if(OK){string s = graph.getVertex(n-1).data + "\nTicket prices: " + to_string(graph.getVertex(n-1).money);ui->textEdit_2->setText(QString::fromStdString(s));}
}

遍历整个景区

遍历算法,一般有深度遍历以及层序遍历两种。此处采用深度遍历递归算法(学校作业要求)。
深度遍历思路:在当前顶点的邻接顶点中还有未被访问过的顶点时,就访问其中一个未被访问的顶点。

void Graph::Dfs(const int n,string &s)
{EdgeNode *p = nullptr;visited[n] = true;cout << G[n].data << "  " ;s = s + G[n].data + " ";p = G[n].First;while (p){if (! visited[p->vertex]){Dfs(p->vertex,s);}p = p->next;}
}
string Graph::DfsTraverse(const int a)
{for (bool & i : visited){i = false;}string s;cout << "The Traversal path :" << endl;for (int j = a;j < numVertex + a;j++){if (! visited[j % numVertex]){Dfs(j % numVertex,s);}}for (int i = 0;i < numVertex;i++){if (visited[i]){cout << i << endl;}}return s;
}

最短路径

最短路径寻求方法:迪杰斯科拉算法 佛洛依德算法
此处采用迪杰斯科拉算法
该算法原理:初始化最短距离数组为起点到其他点的距离,找其中距离最短的加入路径中。并根据加入的点,从起点经过改点到其他点距离是否变短。如果变短,更新当前点的距离。直至所有的点都被访问过。
因为使用距离矩阵更容易实现此算法,所以利用邻接表中的边信息创建一个距离矩阵
利用一个数组来保存路径信息。

void Graph::shortestPath(const int V1,const int V2,QTextEdit* T)
{//find数组保存当前点是从哪个点过来的,便于恢复路径经过的点int find[numVertex];bool visit[numVertex];for (int i = 0;i < numVertex;i++){visit[i] = false;find[i] = V1;}//距离矩阵int path[numVertex][numVertex];//构建距离矩阵for (int i = 0;i < numVertex;i++){for (int j = 0;j <numVertex;j++){path[i][j] = INF;}EdgeNode *p = G[i].First;while (p != nullptr){path[i][p->vertex] = p->weight;p = p->next;}path[i][i] = 0;}//初始化边的信息int min = INF;//选择V1为起始点,将V1的边的信息存入初始d[]中visit[V1] = true;int d[numVertex];for (int i = 0;i < numVertex;i++){d[i] = path[V1][i];}//u存储当前找到的最短路径的中的点int u = V1;for (int i = 1;i < numVertex;i++){min = INF;                       //最小值初始化为一个较大的值for (int j = 0;j < numVertex;j++){if (! visit[j] && d[j] < min){u = j;min = d[j];}}//将找到的u的点存为已经访问visit[u] = true;for (int k = 0;k < numVertex;k++){if (! visit[k] && d[k] > d[u] + path[u][k]){d[k] = d[u] + path[u][k];find[k] = u;}}}//输出最短路径T->setText("");cout << "The shortest path from " + G[V1].data +" to " + G[V2].data +" :" << endl;T->append(QString::fromStdString("The shortest path from " + G[V1].data +" to " + G[V2].data +" :"));int f = V2;string s;while ((f != V1) && (f < numVertex)){cout << G[f].data + " <- ";s = s + G[f].data + " <- ";f = find[f];}cout << G[V1].data << endl;s = s + G[V1].data ;T->append(QString::fromStdString(s));cout << "The value is : " << d[V2];T->append(QString::fromStdString("The value is : " + to_string(d[V2]) + "\n"));cout << endl;
}

最小生成树

(最小成本问题)
最小生成树算法:普利姆算法 克鲁斯卡尔算法
此处采用:普利姆算法
该算法原理:从当前已经访问过的顶点集合中找与之相关联的未访问过的顶点中权值最小的边加入最小生成树,并且将该顶点加入已经访问的顶点集合

void Graph::minimumSpanningTree(QTextEdit* T)
{bool visit[numVertex];for (bool & i : visit){i = false;}int min = INF;visit[0] = true;EdgeNode *p = nullptr;int curr_V = 0;int pre_V = 0;int find[numVertex];for (int i = 1;i < numVertex;i++){min = INF;for (int j = 0;j < numVertex;j++){if(visit[j]){p = G[j].First;while (p != nullptr){if (! visit[p->vertex] && min > p->weight){min = p->weight;curr_V = p->vertex;pre_V = j;}p = p->next;}}}find[curr_V] = pre_V;visit[curr_V] = true;}T->setText("");for (int i = 1;i < numVertex;i++){cout << G[i].data << " --> " << G[find[i]].data << endl;T->append(QString::fromStdString(G[i].data + " --> " + G[find[i]].data));}}

本文作者: 小天g

代码链接:链接: https://pan.baidu.com/s/1q5mNebompqzNI_S_bDRKig 提取码: 9r14

QT + C++ 实现简单旅游景点管理系统相关推荐

  1. 基于ssm旅游景点管理系统获取(java毕业设计)

    基于ssm旅游景点管理系统 旅游景点路线网站管理系统,是基于java编程语言,ssm框架,mysql数据库制作的设计,本设计主要分为用户和管理员两个角色,用户的主要功能是注册登陆系统,查看旅游景点介绍 ...

  2. 基于springboot的旅游景点管理系统

    1.项目介绍 基于springboot的旅游景点管理系统拥有两种角色 管理员:用户管理.旅游线路管理.景点管理.酒店管理.留言管理.攻略管理.车票管理.保险管理.订单管理.各种数据可视化图分析等 用户 ...

  3. [附源码]java毕业设计旅游景点管理系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  4. [附源码]计算机毕业设计JAVAjsp旅游景点管理系统

    [附源码]计算机毕业设计JAVAjsp旅游景点管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(I ...

  5. jsp+ssm计算机毕业设计旅游景点管理系统【附源码】

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. 基于jsp+servlet的旅游景点管理系统。

    运行环境,jdk1.8或者jdk1.7.tomcat8或者tomcat8.5.mysql5.7.eclipse.myeclipse开发环境. 1.

  7. 基于Android的旅游景点推荐

    需求信息: 基于安卓APP旅游景点管理系统实现功能包括: APP客户端: 1:用户注册登录:通过手机号码.用户名称以及密码完成用户的注册和登录 2:景点上报:用户可以上传对应景点的信息 3:景点浏览: ...

  8. JSP旅游景点个性化推荐系统

    本次设计的旅游景点管理系统,可以实现网上查询,预售门票机制,可以让人们清楚的知道当天旅游的人数,并且景点的门票有一定的数量限制,人们可以提前预订,这样各旅游景点才能有一个合理地统筹安排,也让更多的旅客 ...

  9. spring和mybatis结合做简单的增删查改系统_springbootamp;amp;vue简单的景点信息管理系统...

    springboot&&vue简单的景点信息管理系统 这两天闲着没有什么事,就根据陈哥的教程,试着写了一个springboot和vue的简单的景点信息管理系统.也就大致实现了最基本的增 ...

最新文章

  1. html5移动端根据百度地图api获取详细地址
  2. 设计模式-简单工厂模式
  3. linux 获取 基地址,linux - 每个函数加载的glibc基地址不同。 - SO中文参考 - www.soinside.com...
  4. Kubernetes 安装
  5. Happy Birthday
  6. [渝粤教育] 西南科技大学 英语语法1 在线考试复习资料
  7. selenium-行为链-ActionChains-0223
  8. 助力 Android 抗衡 iOS,华为发布方舟编译器!
  9. 晶圆代工28nm制程市场动向
  10. HDU1572 下沙小面的(2)【全排列】
  11. android 判断资源是否使用6,android-download-manager – Android 6获取下载文件的路径
  12. JVM性能优化, Part 5:Java的伸缩性
  13. 重装windows后ubuntu系统启动菜单不见的修复方法
  14. foremost的安装及使用说明
  15. 一键快速打开IE的Internet选项->连接->局域网设置
  16. 字符串分隔StringUtils.delimitedListToStringArray
  17. 【小5聊】本地IP地址设置为任意域名访问
  18. 小心肝队-冲刺日志(第四天)
  19. 南京工业大学计算机考研难吗,南京工业大学(专业学位)计算机技术考研难吗
  20. Esp8266进阶之路14 esp8266的 FreeRtos系统学习的正确姿势,环境配置环境、烧录。(附带demo)

热门文章

  1. 2020年市政方向-通用基础(施工员)考试题及市政方向-通用基础(施工员)考试平台
  2. 平稳过程的各态历经性、谱密度及其例题分析
  3. uniapp开启微信支付、支付宝支付 + Android Studio离线打包APK文件 (前端部分)
  4. java object大小_在Java中,确定对象object大小的最佳方法是什么? - Break易站
  5. 动力气象期末复习笔记
  6. 施工晴雨表图例_工程施工晴雨表范本
  7. 浙江工业大学计算机专硕复试
  8. 求sum=a+aa+aaa+aaaa+...+aa...a(n个a)之值
  9. java jsse ssl 调试_使用Java安全Socket扩展包(JSSE)实现SSL
  10. SpringMVC框架刘宝宝深度版——Springmvc搭建步骤