路径搜索问题

2023-11-07

之前碰到的很多问题都可以归结为路径搜索问题,就是求两点之间的路经

1)是否存在路径

2)求任意一条路径

3)求所有路径

 

求是否有路径和任意一条路径的时候,和正常遍历一样,一个点被mark之后不再访问,因为如果这个结点到终点有路径,之前就应该结束了,没结束说明没路径,再访问也无益。是 O(n)的,对于求所有路径,usedInPath 在进入结点时候mark,退出结点时候unmark, 每个结点可能被多次访问,总体是O(n!)的。可以有一些剪枝,比如当一个结点退出时候如果是可以到达终点的,就可以把这个点的marked重置为false,意思是这个点到终点有路径,可以供其他结点扩展再次进入。如果一个结点返回没有到达过终点,其marked项保持true, 以后再也不用进入。

 

def allPaths(G, start, end):
    marked, path, ans  = [False] * len(G), [], []
    def dfs(v):
        marked[v] = True
        path.append(v)
        num = len(ans)
        if v == end: ans.append(path[:])
        else:
            for w in G[v]:
                if not marked[w]: dfs(w)
        path.pop()
        if len(ans) > num:  marked[v] = False # if current node is connected to end, reopen it
    dfs(start)
    return ans

 

补充,这里的marked和经典dfs里用来防止重复遍历的marked不同,这里是用来防止进入环从而带来无限状态的,而不是防重。路径搜索本身的状态是个 n!的DAG,路径一直在增长,不可能回到之前的路径,不需要去重,只是有环的话会无限多。上面reopen 又用marked做剪枝,是业务语义层面的判断,既不是去重,也不是去环

 

 

 

bfs 求路径问题

1)维护前驱列表,最后还原

2)结点保存路径,存储要求比较高。

3)最短路径必须用bfs,如果是求所有最短路径,扩展到一个结点时候不是立即mark, 而是这一层之后统一mark,因为允许同层的其他结点也指向这个结点。

 

DAG上的路径搜索(有点类似二叉树上的问题 f(root) = g(f(left),  f(right)),当前节点的解依赖于左右孩子上的解。

DAG上还有一种常见搜索,求DAG中最长的路径,例题是POJ最长雪道,以及leetcode 数字三角最长到底边路径。即没有起点和/或终点的路径搜索

一般用 记忆化搜索,递推关系:d[v] = max{ d[w] } + 1 where (v, w)属于边集E。注意是DAG,DAG就是一个结点沿着有向边走下去不会回到自己。雪道问题就是,沿着坡度降低的方向走,高度一直下降,不可能回到路径上任何一点,典型的DAG。

 

背包问题用路径搜索建模:(隐式图建模)

都是DAG,不可逆,一直在减少,不可能回到之前的状态。

1)用最少(最多)硬币凑给定面值V问题

顶点:需要凑的面值。

边:可以进行的状态转移,(可以进行的操作,aka, 选择一个面值的硬币)

问题:从顶点V 到 顶点0的最短(最长)路径问题问题。f[v] = min{ f[v - w[i]] } + 1

2)完全背包问题

顶点:剩余容量C

边:可以进行的状态转移(选择一个物品),边的权值为物品的价值

问题:从顶点C出发的权值和最大的路径,(无终点路径搜索)。f[c] = max{ f[i - V[i]] + W[i]},假如已知图是DAG,那么最短带权路径可以用这个dp,而不只是djisktra

 

如果是必须刚好装满,则是从顶点C出发,到顶点0的最大路径问题(不带权的就是1,带权的就是权值)。

 

DAG下的最短路径径,当然可以用记忆化搜索,然而有一种最针对的方法

按拓扑序遍历节点,relax节点的每条边,最终d[i]和 prev[i]就是最短路径

最长路径求法:每条边的权值取反,然后按上述方法求最短路径,然后将结果d[i]取反

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

路径搜索问题 的相关文章

随机推荐

  • ubuntu配置MySQL远程登录

    很多时候我们需要开启数据库远程访问 以方便管理和使用 这里我们详细介绍在 ubuntu 下配置 mysql 远程访问的方法 1 创建一个可以远程的用户 我们先在root模式下创建一个可以远程的用户账号 创建时我们没有在 test 后面指定h
  • C 标准库 - 《float.h》

    原文链接 https www runoob com cprogramming c standard library float h html 简介 C 标准库的 float h 头文件包含了一组与浮点值相关的依赖于平台的常量 这些常量是由
  • Vue+Flask+Mysql 项目实战

    写在前面 花了几天跟女友一起撸了个前后端分离项目 之前我是搞的算法 这算是第一个正式负责后端的项目 这个项目里边我是负责算法 后端 这篇文章是用来记录一下中间收集到的资料的 一 项目介绍 做的是一个在线图像修复网站 可以实现局域网内访问 主
  • 吸水间最低动水位标高_对《消水规》关于消防水池最低有效水位确定的理解

    消防水池是人工建造的供固定式或移动式消防水泵吸水的储水设施 根据 消防给水及消火栓系统技术规范 GB 50974 2014第4 3 9条规定 消防水池的出水管应保证消防水池的有效容积能全部被利用 消防水池的有效水深是设计最高水位至消防水池最
  • [1175]hive函数greatest、least多列取最大最小值

    文章目录 greatest函数 least函数 用多了 max min 今天刚好遇到了需要取连续6年中营收最大的逻辑 6列 greatest函数 取多列最大值 select greatest 99 0 73 73 存在 null 或者字符串
  • ld.exe: cannot find -l?eclipse上用C/C++时,如何链接静态库?

    对g 和静态库不熟悉的人可能会搞不清楚问题所在 因为我自己在网上很久找不到直接的解决方案 为了方便各大g 初学者学习 我将我的犯错经历和解决办法写在这里 节约时间 可以直接看最后的结果 犯错和解决经历 学习socket的使用的时候 想自己在
  • Canvas 原生实现图片涂抹打马赛克功能

    先看效果 上图是一段打码过后的代码截图 简单说一下实现思路 就是通过创建多个canvas 一个用来绘制原图 一个用来绘制全马赛克图 一个用来绘制笔迹或者叫打码的区域 最后一个canvas用来将三个canvas绘制到一个canvas之上 主要
  • 关于解决IDEA中git的commit无效的解决方法

    关于解决IDEA中git的commit无效的解决方法 在开发中我们偶尔会遇到点击idea中commit无效的情况 点击完commit后 进度条一闪而过缺没有将代码提交上去 下面是本人总结的几种方法 一 重启IDEA 重启大法 俗话说的好 重
  • 算法与数据结构技术书籍从入门到进阶推荐适合大神小白附技术书阅读方法论【附网盘链接】

    转载自某大佬博客 https pymlovelyq github io 2018 10 06 Algorithm 前言 技术书阅读方法论 一 速读一遍 最好在1 2天内完成 人的大脑记忆力有限 在一天内快速看完一本书会在大脑里留下深刻印象
  • ubuntu安装英伟达显卡驱动

    文章目录 1 通过PPA安装 2 手动安装 3 通过ubuntu官方方法安装 4 相关命令 1 通过PPA安装 1 卸载系统里低版本的英伟达驱动 sudo apt get purge nvidia 2 把显卡驱动加入PPA sudo add
  • redis 五种数据类型的底层数据结构

    为了拿捏 Redis 数据结构 我画了 40 张图 完整版 Redis 数据结构并不是指 String 字符串 对象 List 列表 对象 Hash 哈希 对象 Set 集合 对象和 Zset 有序集合 对象 因为这些是 Redis 键值对
  • Docker安装RabbitMQ

    1 首先确保自己的虚拟机安装了Docker环境 可以通过docker v 查看自己的docker是否安装了 docker v Docker未安装可以通过下面的教程安装Docker CentOS7安装Docker教程 2 通过命令安装Rabb
  • 现代文翻译成古文_把现代文翻译成古文诗词,太雅致了!

    1 今文 身不由己古译 向来心是看客心 奈何人是剧中人 2 今文 我们越来越陌生了古译 相達何必曾相识 再看君卿已陌路 3 今文 我也不想你 你也就别想我了 古译 我断不思量 你莫思量我 4 今文 物是人非 我们回不去了 古译 柳絮随风各西
  • 关于计算机视觉中的深度信息概念

    引用 https blog csdn net a1059682127 article details 80503378 https www zhihu com question 406919125 answer 1338670936 单独使
  • kettle抽取数据中文乱码

    kettle如何解决也有一两篇谈到在建数据库连接时加characterEncoding来解决 在kettle中 数据链接中添加属性 数据源和目标 都要添加
  • 使用Vue创建一个商品展示首页

    使用Vue创建项目实现一个商品展示首页 在这篇博客中 我们将使用Vue来创建一个简单的商品展示首页 我们已经有一个后端API提供了商品信息 接口地址为 http localhost 8080 api products 返回的数据格式是JSO
  • C++猜数字小游戏-通过循环实现

    C 猜数字小游戏 通过循环实现 题目 系统随机生成一个1到100之间的数字 玩家进行猜测 如果猜错提示玩家数字过大或过小 如果猜对恭喜玩家胜利 并且退出游戏 每局游戏只能猜5次 实现 通过循环和if判断 源码 include
  • 基于SUSAN算法的边缘检测方法研究(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 SUSAN算子原理 1 2 SUSAN边缘检测算法 2 运行结果 3 Ma
  • Temporary failure in name resolution

    在启动nexus war包时出现以下提示错误 2016 05 04 13 50 12 ERROR main net sf ehcache Cache Unable to set localhost This prevents creatio
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该