Solution1:我的答案

【这思路不好,容易陷入死循环】利用图的DFS,没有标记点是否被访问过。
【BFS更适合用来查找最短路径】

/*
struct UndirectedGraphNode {int label;vector<struct UndirectedGraphNode *> neighbors;UndirectedGraphNode(int x) : label(x) {}
};*/class Path {
public:bool checkPath(UndirectedGraphNode* a, UndirectedGraphNode* b) { //利用深度优先搜索DFS// write code hereif(a == NULL || b == NULL)return false;if(a == b)return true;if(my_DFS(a, b) || my_DFS(b, a))return true;else return false;}bool my_DFS(UndirectedGraphNode* root, UndirectedGraphNode* target) {if(root == NULL) return false;for(int i = 0; i < root->neighbors.size(); i++) {if(root->neighbors[i] == target) {return true;}elsereturn my_DFS(root->neighbors[i], target);}return false;}
};

Solution2:广度优先搜索

利用图的BFS
参考网址:https://www.nowcoder.com/profile/9533316/codeBookDetail?submissionId=12693785
20181010整理

/*
struct UndirectedGraphNode {int label;vector<struct UndirectedGraphNode *> neighbors;UndirectedGraphNode(int x) : label(x) {}
};*/class Path {
public:bool checkPath(UndirectedGraphNode* a, UndirectedGraphNode* b) {// write code hereif (!a || !b)return false;if (a==b)return true;if (my_BFS(a,b) || my_BFS(b,a))return true;elsereturn false;}bool my_BFS(UndirectedGraphNode* a, UndirectedGraphNode* b) {map<UndirectedGraphNode*, bool> map1;queue<UndirectedGraphNode*> que;que.push(a);while (!que.empty()) {//读取队列中的头结点UndirectedGraphNode* ptr = que.front();map1[ptr] = true;if (ptr == b)return true;for (int i = 0; i < ptr->neighbors.size(); i++) {if ((ptr->neighbors)[i] == b)return true;if (map1[ptr->neighbors[i]] != true)que.push((ptr->neighbors)[i]);}//从队列中删除que.pop();}return false;}
};

原始代码

/*
struct UndirectedGraphNode {int label;vector<struct UndirectedGraphNode *> neighbors;UndirectedGraphNode(int x) : label(x) {}
};*/class Path {
public:bool checkPath(UndirectedGraphNode* a, UndirectedGraphNode* b) {// write code hereif(a==NULL||b==NULL)return false;if(a==b)return true;if(my_BFS(a,b) || my_BFS(b,a))return true;elsereturn false;}bool my_BFS(UndirectedGraphNode* a, UndirectedGraphNode* b) {map<UndirectedGraphNode*,bool> map1;queue<UndirectedGraphNode*> que;que.push(a);while(!que.empty()){UndirectedGraphNode* ptr=que.front();map1[ptr]=true;if(ptr == b)return true;for(int i=0;i<ptr->neighbors.size();i++){if((ptr->neighbors)[i]==b)return true;if(ptr->neighbors[i]&&map1[ptr->neighbors[i]]!=true)que.push((ptr->neighbors)[i]);}que.pop();}return false;}
};

利用DFS时可以不用标记某一点是否访问过,只不过耗时长一点。在利用BFS时,由于需要把图的点压入到队列中,所以要标记某点是否访问过,否则会超出内存限制。但保险起见还是应该标记下某一点是否访问过。

【图的有向路径检查】程序员面试金典——4.2有向路径检查相关推荐

  1. 有向路径检查 牛客网 程序员面试金典 C++ Python

    有向路径检查 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径. 给定图中的两个结点的指针DirectedGraphNode* a, ...

  2. 平衡二叉树检查 牛客网 程序员面试金典 C++ Python

    平衡二叉树检查 牛客网 程序员面试金典 C++ Python 题目描述 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1. 给定指向树根结点的指针T ...

  3. C#LeetCode刷题-程序员面试金典

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-程序员面试金典 | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode程序员面试金典 ...

  4. 程序员面试金典--笔记(精华篇)

    原文链接:http://codeshold.me/2017/01/cracking_interview.html <程序员面试金典> 1-7章的总结 相关读物<金领简历:敲开苹果.微 ...

  5. 《程序员面试金典》+《算法导论》

    <程序员面试金典>+<算法导论> 因为最近可能会面临一波面试,但是自己各种算法以及常见的问题的熟悉程度感觉还不够,但是由前几次的代码优化经验来看,算法优化可以说是代码优化的重中 ...

  6. 程序员面试金典——18.10字符串变换

    程序员面试金典--18.10字符串变换 Solution1: 我的答案.穷举法,个人认为此题还是有点难度的... 利用了倒推法以及很高的时间复杂度才解决,并不值得推崇呀. class Change { ...

  7. 程序员面试金典——7.3判断直线相交

    程序员面试金典--7.3判断直线相交 Solution1:我的答案,虽然能AC,但不是很讲究,吸收教训 class CrossLine { public:bool checkCrossLine(dou ...

  8. 《程序员面试金典(第6版)》面试题 16.13. 平分正方形(直线的斜截式方程,C++)

    题目描述 给定两个正方形及一个二维平面.请找出将这两个正方形分割成两半的一条直线.假设正方形顶边和底边与 x 轴平行. 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = [ ...

  9. 回文链表 牛客网 程序员面试金典 C++ Python

    回文链表 牛客网 程序员面试金典  C++ Python 题目描述 请编写一个函数,检查链表是否为回文. 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文. 测试样例 ...

最新文章

  1. android Image zImage uImage boot.img分别是什么?个人笔记
  2. 危机边缘第一季/全集Fringe迅雷下载
  3. ARM、Intel、MIPS处理器的区别
  4. 一句 Task.Result 就死锁, 这代码还怎么写?
  5. 关于feign开启hystrix导致用户鉴权失败
  6. Android文件夹占用空间分析,关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析...
  7. Mapper代理详解,Mapper代理的作用以及用法,结合之前写的mybatis框架讲解、mapper代理的好处
  8. 问卷星的自动答题脚本
  9. wpf 复制到粘贴板_将WPF UI单元复制到剪贴板
  10. SPSS学习(五)独立样本t检验
  11. 成都盛铭轩:详情页怎么设计
  12. SCIgen - An Automatic CS Paper Generator
  13. AppStore发布流程(从证书创建到app发布一站式)
  14. 系统cpu主频查看设置
  15. uni-app手写签名并上传七牛云
  16. C语言怎么才能让末尾没有多余的空格_C语言干货分享
  17. RabbitMQ的持久化
  18. 硬核FutureTask解析
  19. 2022大厂前端面试题手册
  20. 我的爸爸正在计算机前写报告,关于计算器的作文结尾

热门文章

  1. 阿里云服务器的公网ip访问不到的问题
  2. android+默认存储,Android 数据存储之SP存储,内部存储,外部存储
  3. php小程序支付notify,PHP 小程序支付
  4. mysql序列化字段反序列化_序列化serialize()与反序列化unserialize()的实例
  5. extjs 方法执行顺序_(软件工程)非结构化程序变为结构化程序的三种方法
  6. python调用pipe_Python中使用PIPE操作Linux管道
  7. pycharm 显示空格及tab
  8. java数组线性查找_数组查找: 线性查找与二分查找
  9. g++ -std=c++_在C ++ std库中使用sort()
  10. 如何使用PyTorch torch.max()