首页 > 编程语言 >数据结构与算法学习(1)——DFS(深度优先搜索)

数据结构与算法学习(1)——DFS(深度优先搜索)

时间:2024-04-20 13:34:13浏览次数:27  
标签:return int vertex dfs source 算法 DFS visited 数据结构

DFS基础

深度优先搜索算法(英语:Depth-First-Search,缩写为DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

题目

PS:下列题目均来自leetcode中灵神题单

547.省份数量

"""
我们使用for循环遍历每个不同的city作为起点如果该city没有被访问,那么我们就意味着我们遇到了一个新的连通分量,
把res加一,然后用构造函数dfs搜索该连通分量
dfs函数的实现方法是,输入某个顶点,然后递归访问邻接找到与该顶点连通的所有顶点,加入visited标志已访问.
"""
class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        visited=[]
        n=len(isConnected)
        res=0
        def dfs(vertex):
            for i in range(n):
                if isConnected[vertex][i]==1 and i not in visited:
                    visited.append(i)
                    dfs(i)

        for i in range(n):
            if i not in visited:
                dfs(i)
                res+=1
        return res

1971. 寻找图中是否存在路径

#超出内存限制了...
"""
把edge转换成邻接矩阵
然后按照上面的题目解法只搜索有关source的连通分量
最后检查source的连通分量中有没有destination
"""
class Solution:
    def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
        G=[[0 for _ in range(n)] for _ in range(n)]
        for i in range(n):
            G[i][i]=1
        for v,vn in edges:
            G[v][vn]=1
            G[vn][v]=1
        def dfs(vertex):
            for i in range(n):
                if G[vertex][i]==1 and i not in visited:
                    visited.add(i)
                    dfs(i)
        visited=set()
        dfs(source)
        return destination in visited
#把邻接矩阵换成邻接表就通过了(虽然很慢)
class Solution:
    def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
        if len(edges)==0:
            return source==destination
        G=defaultdict(list)
        for v,vn in edges:
            G[v].append(vn)
            G[vn].append(v)
        def dfs(vertex):
            for i in G[vertex]:
                if  i not in visited:
                    visited.add(i)
                    dfs(i)
        visited=set()
        dfs(source)
        return destination in visited
#官方解法
class Solution:
    def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
        if len(edges)==0:
            return source==destination
        G=defaultdict(list)
        for v,vn in edges:
            G[v].append(vn)
            G[vn].append(v)
        def dfs(vertex):
            if vertex==destination:
                return True
            visited.add(vertex)
            for i in G[vertex]:
                if  i not in visited and dfs(i):
                    return True
            return False
        visited=set()
        return dfs(source)

标签:return,int,vertex,dfs,source,算法,DFS,visited,数据结构
From: https://www.cnblogs.com/zzddkkhome/p/18147474

相关文章

  • Python与Java数据结构语法区别
    数组参考链接:CS61BPythonzeroedLst=[0,0,0]lst=[4,7,10]lst[0]=5print(lst[0])print(lst)print(len(lst))Javaint[]zeroedArray=newint[3];int[]array={4,7,10};array[0]=5;System.out.println(array[0]);System.out.println(Ar......
  • 分布式文件系统FastDFS安装教程
     转载链路地址https://www.cnblogs.com/handsomeye/p/9451568.html  前言centos7x642009、vmware16pro(网络仅主机模式)安装libfastcommon获取libfastcommon安装包:wgethttps://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz解压安......
  • 基环树算法总结
    基环树算法总结一、什么是基环树基环树,顾名思义,有两个要素:环和树。因此,基环树就是一棵树的一个节点,扩成一个环,做题时,多棵基环树组成的基环树森林,常以如下方式出现:每个点只有一个出边。每个点只有一个入边。图中一共有\(n\)个点,\(n\)条边。那么,基环树类型的题目应该怎......
  • 31天【代码随想录算法训练营34期】第八章 贪心算法 part01(● 理论基础 ● 455.分发
    贪心算法就是先选局部最优,再推全局最优没有套路将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解●455.分发饼干classSolution:deffindContentChildren(self,g:List[int],s:List[int])->int:g.s......
  • 人间算法题:到底是不是一个环?
    很多人都说人生就是一个循环,每天重复重复。而所谓环,对于写代码的小伙伴来说是有特殊定义的。我的理解就是节点循环,就成了环。刚好刷到一个掘金好友分享的腾讯一面算法题:判断一个单链表是不是一个环。其实有很多办法来实现,但是我更喜欢用快慢指针来判断环的形成。思路如下:定义......
  • 行人属性AI识别/人体结构化属性AI识别算法的原理及应用场景介绍
    行人属性AI识别技术是一种基于人工智能技术的图像识别技术,通过对行人的图像或视频进行处理和分析,提取出其中的结构化信息,如人体姿态、关键点位置、行人属性(性别、年龄、服装等)等。行人结构化数据分析的方法包括姿态估计、关键点检测、行人属性识别等:姿态估计是指根据行人的姿势......
  • 数据结构-线性结构-基础介绍
    前言本文是看bilibili·王道考研·数据结构的视频课程时做的一些记录,如构成侵权,请联系我删除另外,本文有部分内容是根据我的理解写的,可能有不明确的地方awa王道考研的视频地址我就不放了,大家请移步bilibili直接搜索王道考研就能搜索到线性结构-一对一关系除了第......
  • SPFA算法
    单源最短路算法,可以处理负边权,平均时间复杂度\(O(kn)\),最坏时间复杂度\(O(mn)\)问题描述:有一个连通图\(G=(V,E)\),连接节点\(i\)和节点\(j\)的边权写作\(e^i_j\)(\(e^i_j\geq0\)),求从起点(\(s,s\inV\))开始,到其它各个节点(\(d,d\inV-s\))的最短路长度。思路详解:设从起点s到节点d......
  • day15_我的Java学习笔记 (Collection、数据结构、List、泛型深入)
    1.集合概述2.Collection集合的体系特点3.Collection集合常用API1.添加元素,添加成功返回true,失败返回false2.清空集合的元素3.判断集合是否为空,是空返回true,反之为false4.获取集合的大小5.判断集合中是否包含某个元素6.删除某个元素(......
  • yolo,rcnn,fastrcnn,ssd等算法有的区别
    chatgpt回答:YOLO(YouOnlyLookOnce),RCNN(Region-basedConvolutionalNeuralNetworks),FasterR-CNN,SSD(SingleShotMultiBoxDetector)等算法都是用于目标检测的经典算法,它们在实现目标检测任务时有一些区别。YOLO:YOLO是一种单阶段(single-stage)目标检测算......