描述

设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存在由顶点vi

输入

多组数据,每组m+3数据行。第一行有两个数字n和m,代表有n个顶点和m条边。第二行有n个字符,代表n个顶点的编号。第三行到第m+2行每行有两个字符h和k,代表边依附的两个顶点。第m+3行有两个字符vi和vj,代表需要判断的两个顶点。当n和m都等于0时,输入结束。

输出

每组数据输出一行。若存在路径输出“YES”,反之输出“NO”。

输入样例 1

3 2
abc
ab
bc
ac
4 2
bcsw
bs
sw
cs
0 0

输出样例 1

YES
NO

思路:

采用了unordered_map,假设DFS的思想你已经大致了解了(就是知道那个意思,但是自己不能完整地实现出来,那个意思),如果不清楚DFS的话直接看这个视频就行了!DFS深搜解决迷宫问题(原理分析+代码实现)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1bK4y1C7W2

全局变量

unordered_map<char, int> mp;用来存储每个节点对应的序号,不用map的原因是map会根据key值自动排序,而我们不能让它自动排序,所以用unordered_map
int visit[30];访问数组

创建邻接表的时候把它的每个字母及其出现顺序存进mp里,方便以后邻接表表头数组按顺序使用——>写一个GetPos函数来获得某个字母所对应的位置:迭代器从头迭代,返回指向的second就行了,这个不是重点,略过;

注意:这个题是有向图!!!创建的时候方向别写多了!!邻接表初始化别忘了把next置为NULL!

DFS函数是重点,我们出发的点是from,要去的点是to,那么出口就是from==to,因为是从from出发去找to,所以他俩相等的时候说明找到了,

如果不相等,那么就从当前的from对应的位置开始寻路,GetPos函数获取当前from对应的位置,visit先标记这个点为1(已访问),若p->next存在,说明有路,那么把p->next->data作为from传进去,继续调用DFS(这就是递归),此时from从一开始的点走到了它能走到的下一个位置,相当于模拟了“寻路”。

那么按照这个思路,如果有路,不会到DFS的下一条语句就已经找到输出YES了,YES方向结束。

递归调用的下一条是visit[当前节点的序号值]=0,刚才标记是1是因为这个点已访问,上一段说道若输出YES则不会立刻执行这句,那么这句对应的就是“没路”的情况,也就是p->next=NULL的情况,那么你想:在不回头的情况下(有向图),如果走到死胡同了,那还可能到目的地吗?不可能,所以直接输出NO。

个人感觉DFS算法的精髓在于先标记,再DFS,再取消标记,这三步是核心,你写的时候如果有这三句,那么一般也差不多了,注意参数调用就没什么问题了~

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<unordered_map>
using namespace std;typedef struct LNode
{char data;struct LNode* next;
}*linklist, LNode;
typedef struct
{linklist VList;int vnum;int anum;
}ALGraph;
unordered_map<char, int> mp;
int visit[30];
int GetPos(char c,unordered_map<char,int>mp)
{unordered_map<char, int>::iterator it = mp.begin();while (it != mp.end()){if (it->first == c)return it->second;it++;}return 0;
}
void Create(ALGraph& alg, int n, int m)
{alg.anum = m;alg.vnum = n;alg.VList = new LNode[alg.vnum + 1];string s;cin >> s;for (int i = 1; i <= n; i++){alg.VList[i].data = s[i];alg.VList[i].next = NULL;mp.insert(make_pair(s[i-1], i));}for (int i = 0; i < m; i++){cin >> s;int pos = GetPos(s[0],mp);linklist p = &alg.VList[pos], q = new LNode;q->data = s[1];q->next = p->next;p->next = q;}
}
void DFS(ALGraph alg,char from,char to)
{if (from == to){cout << "YES" << endl;return;}int pos = GetPos(from, mp);linklist p = &alg.VList[pos];visit[pos] = 1;if (p->next){DFS(alg, p->next->data, to);visit[pos] = 0;}else{cout << "NO" << endl;return;}
}
int main()
{int n, m;while (cin >> n >> m && n != 0 && m != 0){ALGraph a;Create(a, n, m);string s;cin >> s;char from = s[0], to = s[1];DFS(a, from, to);mp.clear();}
}

4013-基于深度优先搜索的两顶点路径存在与否的判断(C++,附详细思路)相关推荐

  1. 4013基于深度优先搜索的两顶点路径存在与否的判断

    描述 设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存在由顶点vi 输入 多组数据,每组m+3数据行.第一行有两个数字n和m,代表有n个顶点和m条边.第二行有n个字符,代表n个顶点 ...

  2. BJFU_数据结构习题_284基于深度优先搜索的两顶点路径存在与否的判断

    欢迎登录北京林业大学OJ系统 http://www.bjfuacm.com 284基于深度优先搜索的两顶点路径存在与否的判断 描述 设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存 ...

  3. 无向图、深度优先搜索(无向图)、广度优先搜索(无向图)、无向图路径查找(基于深度优先搜索)

    一.无向图 1.1 图的相关术语 相邻顶点: 当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点. 度: 某个顶点的度就是依附于该顶点的边的个数. 子图: 是一幅图的所 ...

  4. 基于深度优先搜索回溯法的人狼羊菜过河模型

    基于深度优先搜索回溯法的人狼羊菜过河模型 本文介绍一个农夫过河的小模型,算法 Python 实现,感觉还挺有趣的,因原为笔者课程作业论文改版而来,所以文章内容比起其他博客文章可能会比较严肃与严谨.期待 ...

  5. (国赛B题)沙漠掘金——基于深度优先搜索的沙漠掘金游戏策略求解(上)

    摘要 穿越沙漠游戏是一个由单人或多人玩家在一定的游戏参数设定之下,综合考虑行走路径,移动策略以及购买策略以实现最终收益最大化的项目,本文主要从最优移动策略的性质出发讨论如何快速计算寻找所有可能路径,以 ...

  6. 基于深度优先搜索的填字游戏解决方法

    题目:□□□+□□□=□□□,□中可填入数字1-9,输出所有可能的结果,统计个数 <span style="font-size:18px;">package match ...

  7. 基于冲突搜索的多机器人路径规划(Matlab代码实现)

     目录

  8. 2023版Python数据分析,学习路径拆解及资源推荐(附详细思维导图)

    关于Python数据分析,其实网上能够找到的学习资源很多,主要分为两类: 一类是提供各种资源的推荐,比如书单.教程.以及学习的先后顺序: 另一类是提供具体的学习内容,知识点或实际案例. 但很多繁琐而又 ...

  9. Python数据分析,学习路径拆解及资源推荐(附详细思维导图)

    关于Python数据分析,其实网上能够找到的学习资源很多,主要分为两类:一类是提供各种资源的推荐,比如书单.教程.以及学习的先后顺序:另一类是提供具体的学习内容,知识点或实际案例. 但很多繁琐而又杂乱 ...

最新文章

  1. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
  2. SQLSERVER 2008 R2 事务日志已满
  3. Scrapy:python3下的第一次运行测试 1
  4. 二叉搜索树的插入与删除(C语言)
  5. linux 中断 c语言程序,linux驱动之中断处理过程C程序部分
  6. 嵌入式linux软件/驱动开发工程师需要哪些知识
  7. 内网渗透测试:隐藏通讯隧道技术
  8. Isilon旧机器重新初始化
  9. 开发QQ桌球瞄准器(4):透明度、颜色、线宽与母球大小
  10. 自然语言处理从零到入门 成分句法分析
  11. UE4 Spline
  12. Day16_IO框架1(File类, IO流, 字节流字符流, IO异常, Properties)
  13. vbox虚拟机添加硬盘
  14. python胶水语言为什么_为什么只有python是胶水语言?
  15. QQ浏览器网页版微信抓包和IPAD微信抓包 Wireshark
  16. windows服务器如何搭建网站,Windows系列服务器网站搭建详细过程
  17. 数据分析师需要学习什么课程?
  18. 游戏音乐制作中需要使用那些软件?
  19. ArcGIS 10.2.2支持无损CityGML格式进行3D城市建模
  20. python开头声明_python开头——文件声明 详解

热门文章

  1. 近一个月来的学习总结(今天的你比昨天的你进步了吗?)
  2. 移动端开发 main.js入口文件
  3. redis 系列7 数据结构之跳跃表
  4. Anaconda jupyter-notebook 添加kernel
  5. ES6 let和const命令(3)
  6. Hbase的伪分布式安装
  7. oracle运维工作中每天巡检的必要性--job的相关问题
  8. 本周耐撕团队个人总结
  9. 转载:Mongodb start
  10. 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧