面试题 04.01. 节点间通路(C++|DFS|队列|unordered_set)

news/2024/7/20 22:09:11 标签: leetcode, 深度优先, 算法

题目链接:力扣

题目描述

节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。

示例1:

 输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2
 输出:true
示例2:

 输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start = 0, target = 4
 输出 true
提示:

节点数量n在[0, 1e5]范围内。
节点编号大于等于 0 小于 n。
图中可能存在自环和平行边。

果果念

又是涨知识的一天(不是,补算法中....)。今天下午上了高级算法课,讲到了DFS和BFS,今天晚上刷了一道leetcode题目,本来想多刷几道呢,无奈快乐的时光美好而又短暂(不是,自己太菜了...),下面分享一下这道题目。

还没有遇到过一些面试或者机试考图论的,但是基础的深搜和广搜应该是需要掌握的,我发现自己的基础太差了,这几天也不敢投简历了。上次的堆排序和快速排序今天又看了一下,也敲了一下,多多思考,会有收益哒。

关于这道题目,就是一个很经典的深搜题目,广搜应该也可以做吧。主要说一下两点:

  • 第一点:关于集合,我还是第一次使用stl中的集合,unordered_set,集合中的性质就是不可以插入同样的元素,也就是唯一性。因为这道题目是有向图,而且还可能存在平行边,因此,这里使用vector<unordered_set<int>> edge,edge.resize(n),建立边。
  • 第二点:标记数组,这个标记数组的作用是为了避免环,这里也使用了STL自带的unordered_set<int> visted,利用visted.count(v)>0判断v是否已经被访问过,也就是这个集合是否包含v,visted.insert(v),访问v。

拓:我利用了队列记录了访问的顺序,嘻嘻。

unordered_set:元素内部没有排序,基于哈希表;

set:基于红黑树实现,有序的。

刚刚喝了一杯真果粒,不是广告,好开心啊。

代码

class Solution {
public:

    vector<unordered_set<int>> edge;//边
    unordered_set<int> visited;//标记数组,标记走过的顶点
    queue<int> path;//标记路径

    bool dfs(int start, int target){
        
        //已经走过这个定点了,别尝试了,我的宝
        // cout<<visited.count(start)<<endl;
        if(visited.count(start)){
            return false;
        }

        //我的宝儿,你成功了
        if(start==target) return true;

        visited.insert(start);

        for(auto &v:edge[start]){
            //我的宝儿,有一个走通,就代表存在通路呀
            path.push(v);
            if(dfs(v,target)){
                return true;
            }
            path.pop();
        }
        return false;
    }
    bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {
        //节点编号 0~4
        edge.resize(n);//n个顶点
        for(auto &e:graph){
            edge[e[0]].insert(e[1]);//去掉平行边
        }
        bool ans=dfs(start,target);
        // cout<<path.size()<<endl;
        while(path.empty()!=true){
            // cout<<path.front()<<endl;
            path.pop();
        }
        return ans;
    }
};

c++ set与unordered set的区别 - 阿玛尼迪迪 - 博客园


http://www.niftyadmin.cn/n/1614561.html

相关文章

移动2.0论坛•产业趋势年会:移动互联网是蚂蚁雄兵的时代

2011年12月20日&#xff0c;由《今日财富》杂志社联合王利杰共同举办的“移动2.0论坛产业趋势年会暨新年社交酒会”在北京开幕。现场邀请了奇虎360、电信、华为、点评等十多家移动互联行业公司高管&#xff0c;围绕“移动互联网之质变”和“移动互联网之移动化变革”两大主题上…

为什么苹果要砸重金收购闪存公司Anobit

据报道&#xff0c;苹果以5亿美元实现了对以色列闪存公司Anobit的收购&#xff0c;以色列财经类报纸Calcalist称&#xff0c;苹果可能会在以色列建造一个研发中心。这笔收购是继1996年收购NexT公司以来苹果最大的交易&#xff0c;Anobit公司对提升苹果产品市场竞争力有怎样的战…

【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看

本文转载自 【面试】如果你这样回答“什么是线程安全”&#xff0c;面试官都会对你刮目相看&#xff0c;这篇文章讲解的通俗易懂&#xff0c;尤其是对于堆和栈以及内存空间的比喻&#xff0c;形象生动。下面我只配一张图&#xff0c;供大家理解。 图源&#xff1a;Java 虚拟机 …

Air Dictate:用Siri解放你在Mac上打字的双手

用手打字是不是显得很老土&#xff1f; 有iPhone 4S和一台Mac么&#xff1f;那就试试一个叫做Air Dictate的无需手写也可打字的应用吧。 由于现在没有开放的Siri的API&#xff0c;所以一个叫做Avatron的开发者发现一个方法来控制Siri&#xff0c;将语音转换为文本&#xff0c;然…

数学思维1-金字塔

题目链接&#xff1a;金字塔_牛客题霸_牛客网 题目描述 众所周知&#xff0c;金字塔是一层一层堆砌而成。 如下图&#xff0c;金字塔的最顶层有一个点&#xff0c;第二层有三个点&#xff0c;第三层有六个点&#xff0c;以此类推…… 有一个无限大的金字塔&#xff0c;前 nn 层…

iPad版《丁丁历险记》:图书,电影和应用已经融为一体

如果你是一个《丁丁历险记》粉&#xff0c;你可能会知道这电影已经在放了&#xff1b;但如果你是一个忠实的粉丝&#xff0c;你可能还会知道这其实是一本书。纸质书要39.99美金&#xff0c;而在iPad上面只需要5.99美金。因为也有相同的插图&#xff0c;更多的3D人物模型&#x…

排序算法C++

快速排序 #include <iostream> #include <vector> using namespace std;//partiotion算法 int partition(vector<int>&nums,int left,int right){int pivotnums[left];while(left<right){//从右边找到一个比pivot小的值 while(left<right&&a…

2012年HTML 5的14大预测

编者按&#xff1a;本文原作者是Spaceport.io创始人Ben Savage&#xff0c;Spaceport.io是一个面向移动游戏开发者的本地Javascript和HTML 5平台。文章编译过程中&#xff0c;内容有少量删改。 不管是Zynga、Facebook、Google、微软、苹果&#xff0c;还是众多新兴的初创公司&a…