zoukankan      html  css  js  c++  java
  • 图、dfs、bfs

    graph
    dfs
    bfs

    1.clone graph
    2.copy list with random pointer
    3.topological sorting
    4.permutations
    5.subsets
    6.n queens
    7.subsetsII 
    8.palindrome partitioning
    9.combination sum
    10.combination sumII
    11.word ladder 
    12.word ladderII

    克隆图:先克隆点,再克隆边。
    宽度优先搜索有模板,以后告诉了图中的一个点,遍历整张图先想到宽度优先搜索
    宽度优先搜索一般有个队列
    哈希表

    一张图一般不会给你整张图,一般给你的是图中的某一个节点

    拓扑排序: 度、入度、出度
    每次遍历入度为0的点。去掉入度为0点的边,再遍历剩下的图的入度为0的点
    本质上还是一个遍历图的问题
    用宽度优先搜索,用dfs时间复杂度大
    如果多个点入度为0,随便从哪个点开始排都可以,所以可能同一个图出现多个拓扑排序的结果

    图的题主要掌握宽度优先搜索


    图和树的宽度优先搜索的对比:都使用队列
    树是循环左子树和右子树,图是循环整个相邻的点

    有些图的遍历用hash表示这个节点有没有被遍历过

    permutations:搜索问题的模板问题
    找所有情况的问题想到用dfs,一般只有dfs才能搜索完所有的情况
    dfs搜索树
    所有的叶子节点相当于permutations问题的可行解
    按照搜索树的思想去实现,每个叶子节点其实就是permutations问题的答案
    写代码的时候,按照搜索树的思想去模拟搜索的过程就可以
    需要回溯到本层,所以需要删除
    递归的方法

    permutations求所有的排列情况,subsets求所有的子集

    subsets:求子集问题也是另一类模板题
    去返回所有解,所有可行性的时候,考虑dfs
    想到dfs,就需要构建深度优先搜索树
    子集不分顺序
    之前选择的元素,下一次就不再选择
    这个深度优先搜索树,每个节点都是解
    每次遍历是从position向后遍历

    permutations:
    时间复杂度:O(n!)
    subsets:
    时间复杂度: O(2的n次方)


    n queens:一碰到求所有可行性的题,就想到用dfs的方式
    转换为permutations问题,不一样的地方在于:每次按照permutations问题放置皇后之后,再写一个check函数,检查在列和对角线上是否有冲突
    permutations变形上加了check函数
    时间复杂度:O(n!)


    subsetsII:需要排序。想把相同的元素排在一起,这样就可以考虑重复的情况。

    palindrome partitioning:
    与subsets类似,因为subsets也是针对每个值选与不选
    时间复杂度:O(2的n-1次方),实际就是 O(2的n次方)

    combination sum、combination sumII:求所有满足条件的子集

    word ladder:简单图最短路的问题
    不可以使用dfs
    先用bfs求每个节点到起始节点的距离,然后使用dfs求出所有可行路径



  • 相关阅读:
    镜像劫持2
    镜像劫持2
    Windows核心编程 第十七章 -内存映射文件(下)
    Windows核心编程 第十七章 -内存映射文件(下)
    WindowsPE 第五章 导出表编程-1(枚举导出表)
    WindowsPE 第五章 导出表编程-1(枚举导出表)
    PowerShell-2.解决禁止本地执行脚本
    PowerShell-2.解决禁止本地执行脚本
    PowerShell-1.入门及其常用
    CodeForces B. Creating the Contest
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10686224.html
Copyright © 2011-2022 走看看