旅游资讯系统的寻路算法(数据结构实验)

问题描述

设计与实现南普陀、胡里山炮台、曾厝埯和厦门大学思明校区主要景点(如上弦场、芙蓉湖等),还有翔安理工大学的旅游咨询系统,为游客提供游程最短的最优决策方案。

需求分析

对问题进行抽象:在一张给定的连通分支为一的每条边含有正权值的无向图中,选择若干个点,要求寻找出包含这若干个点且权值和最小的通路。

算法设计

在我看来实际上这个问题也是对图的遍历,只是遍历结束的条件由经过所有点变成了经过所有选中的点,所以相对于正常的图的遍历,我们只需要把结束的判定条件改一下就可以了。

bool judge(int des[],int n)//判断是否走完了全部目标
{bool *flags=new bool[n_v];memset(flags, false,n_v);//初始化for(int i=0;rec[i]!=-1;i++)flags[rec[i]]=true;for(int i=0;i<n;i++)if(flags[des[i]]==false)return false;return true;
}

修改过的检验代码如上,大致就是判断des(destination记录目标点的数组)里面的元素是不是都被记录在rec(走过点的数组)里,也即是否每个目标点都被访问过了,是则返回true,否则返回false。

而确定了这个问题本质上依旧是对图的遍历之后,之前图的遍历里面用到的深度优先搜索(dfs)和广度优先搜索(bfs)也就可以照搬过来,我这里选择的是dfs,不过理论上bfs应该也是可行的。

void find_way(int des[],int n,int x,int cou=0)//n是目标个数,x是起点,cou是已经走过点的数量
{if(judge(des,n))//如果达成一种结果 {int sum=0;//用于记录该结果的总长度 for(int i=1;rec[i]!=-1;i++)sum+=a[rec[i-1]][rec[i]];if(sum<len){cout<<"恭喜!找到了一条路:";len=sum;for(int i=0;rec[i]!=-1;i++){res[i]=rec[i];//储存当前最优解 cout<<res[i]+1<<' ';}cout<<"这条路的长度是:"<<len<<endl;}return;//返回}for(int y=0;y<n_v;y++){if(a[x][y]>0 && times[x][y]<2)//如果可以走 {//cout<<"One step forward"<<y+1<<endl;times[x][y]++;times[y][x]++;rec[cou]=x;cou++;//留痕 find_way(des,n,y,cou);//递归times[x][y]--;times[y][x]--;rec[cou]=-1;cou--;//恢复现场//cout<<"One step back"<<x+1<<endl;}}
}

以上是修改过的dfs代码,细心的读者不难发现,代码的整体框架和dfs是一样的(事实上我就是用下面的dfs代码修改写出的find_way)。

void dfs(int x,int y=0)
{if(x==n_v)//如果达成一种结果,不过在这里是多余的{return;//返回}//cout<<x+1<<' ';for(;y<n_v;y++){if(a[x][y]==1 && !check[y])//如果可以走{check[x]=true;//留下痕迹dfs(y,0);//递归//这里应该要恢复现场,不过这个dfs只遍历一次,所以不是必须的}}
}

可以看到,二者代码实际上有着很高的对应程度,所以说dfs是本算法的核心思想。不过不同的点也有:

(1)因为要进行多次遍历而不是找到一组解就可以结束,所以这里使用了rec数组去动态记录目前走过的路的records,而当找到一条满足的且更短的通路时就把它转移到res数组里面作为result存起来,同时把总长度存到全局变量len(gth)里面

旅游咨询系统的寻路算法(数据结构实验)相关推荐

  1. 探索迷局:解密广度寻路算法

    ================================ 专栏文章,自下而上 数据结构与算法--二叉搜索树 数据结构与算法--深度寻路算法 数据结构与算法--二叉树+实现表达式树 数据结构与算 ...

  2. 【数据结构与算法综合实验】景区信息管理系统迭代开发

    说明:这是武汉理工大学计算机学院数据结构与算法综合实验课程的第二次项目:景区信息管理系统迭代开发代码. >>点击查看武汉理工大学计算机专业课程资料汇总 源码+实验报告下载地址(运行环境:V ...

  3. a - 数据结构实验之串一:kmp简单应用_Java程序员必会之数据结构与算法全梳理

    常见的数据结构 链表 LinkedHashSet LinkedList 底层数据结构由链表和哈希表组成. 数据的添加和删除都较为方便,就是访问比较耗费时间. 数组 ArrayList 访问数据十分简单 ...

  4. 算法与数据结构实验题 10.23 寡人的难题

    算法与数据结构实验题 10.23 寡人的难题 ★实验任务 寡人心系天下为国为民,想要在历史中留下点痕迹,就必须要让国家强盛起来,正所谓想致富先修路,寡人觉得去修路,那些吃干饭的大臣给了寡人很多条要修的 ...

  5. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  6. 数据结构与算法综合实验(附完整项目)

    数据结构与算法综合实验--练练看系统 系统设计 效果展示 1. 菜单界面 2.游戏界面 3.游戏结束界面 开源链接 linkGame代码传送门

  7. 数据结构实验一 —— 矩阵相乘算法

    数据结构实验一 -- 矩阵相乘算法 实验名称 矩阵相乘算法 实验内容 实现两个矩阵的相乘算法. 实验要求 输入要求:矩阵大小阶数及元素值可以在程序中固定.但最好不固定矩阵形式,从键盘输入矩阵阶数以及元 ...

  8. 南京邮电大学数据结构实验四(各种排序算法)

    南邮数据结构实验报告四----各种排序算法 一.各类算法 (一)简单选择排序 (二)直接插入排序 (三)冒泡排序 (四)快速排序 (五)两路合并排序 (六)堆排序 二.全部排序整合+时间测试 三.算法 ...

  9. 【数据结构与算法综合实验】欢乐连连看(C++ MFC)案例

    说明:这是武汉理工大学计算机学院数据结构与算法综合实验课程的第三次项目:欢乐连连看(C++ & MFC)迭代开发代码. >>点击查看武汉理工大学计算机专业课程资料汇总 >&g ...

  10. 【课程记录·本】WUT数据结构与算法综合实验 | 基于C++MFC的欢乐连连看游戏的设计与实现(附下载链接)

    本文基于文章" https://blog.csdn.net/cxh_1231/article/details/89577820 "二次修改发布,原文已失效,不再维护 我的微信公众号 ...

最新文章

  1. linux管道的执行顺序
  2. 2018.1.15 6周1次课
  3. AS3 CookBook学习整理(十七)
  4. Java关于文件上传的一个例子
  5. Oracle语句连接查询
  6. ap计算机科学a买什么书,准备AP*计算机科学A考试-第1部分
  7. Unity3D-光照系统
  8. 详解jenkins几个有用的插件如何使用(emma,findbugs)
  9. CMake的简单使用
  10. Python-科比投篮预测
  11. 2022蓝桥杯你值得拥有
  12. 宝塔环境下MinDoc的安装教程
  13. 高数——两个重要极限
  14. 一名IT民工开通博客
  15. 贝叶斯在计算机视觉中的应用,KNN与朴素贝叶斯在计算机视觉的鱼苗计数中的应用探索.doc...
  16. el-tree处理大量数据
  17. 华为认证Datacom考试内容
  18. 各种图论模型及其解答
  19. 机器学习(二):k近邻法(kNN)
  20. JAVA RPG游戏

热门文章

  1. 微波通信入门,新人必读!
  2. 一个集成电路静电保护电路(ESD)工艺
  3. 【个人回顾】西安电子科技大学-周佳社-微机原理与接口设计-2
  4. PHP面向对象-面向对象含义-1-1-1
  5. 创建Spring Boot工程 流程 以及基本操作
  6. Atlas 200I DK A2开发者套件通过路由器联网(360安全路由-V2)
  7. PyTorch笔记 - Word Embeddings Word2vec 原理与源码
  8. thematic主题框架之子主题style.css详解
  9. 如何一个月过英语四六级?
  10. HDLbits答案更新系列12(3.2.5 Finite State Machines 3.2.2.5 Simple state transitions 3等 )