路径搜索问题

路径规划——搜索算法详解(一):Dijkstra算法详解与代码 一文带你搞定Dijkstra算法!(附带c++实现代码) 阅读详情

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

1)是否存在路径

2)求任意一条路径

3) 是否存在环

4)求所有路径

求是否有路径和任意一条路径以及判断是否存在环的时候,和正常遍历一样,一个点被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做剪枝,是业务语义层面的判断,既不是去重,也不是去环

无向图判断是否有环

和原始的图遍历dfs算法几乎一样,只是要带上上游节点信息,a->b, b->a 不算环。

class Solution {
    char[][] grid;
    boolean[][] marked;
    public boolean containsCycle(char[][] grid) {
        this.grid = grid;
        this.marked = new boolean[grid.length][grid[0].length];
        for (int i = 0; i < grid.length; ++i) {
            for (int j = 0; j < grid[i].length; ++j) {
                if (!marked[i][j] && dfs(i, j, -1, -1)) return true;
            }
        }
        return false;
    }
    
    boolean dfs(int i, int j, int p, int q) {
        marked[i][j] = true;
        for (int[] d : new int[][] {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}) {
            int x = i + d[0], y = j + d[1];
            if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length && (x != p || y != q) && grid[x][y] == grid[i][j]) {
                if (marked[x][y] || dfs(x, y, i, j)) return true;
            } 
        }
        return false;
    }
}

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]取反

搜索——基于路径的搜索 但是有一种特殊情况,如果当所有节点间的边/权重都是相同的为一固定常数,那么BFS便是最优的(最常见的情况就是无权重图,或者是权重均为1)(一般地,如果路径代价是基于节点深度的非递减函数,那么BFS是最优的)。在图搜索时,DFS也非最优,这是因为DFS总是偏向于找到整棵树上靠左侧的解,并不能保证找到的解是最优的。接着,由于每一步的代价非负的,随着节点的增加路径不会变短。这是因为,BFS偏向于寻找整棵树中最浅的节点,如果解存在,那它一定位于有限层上,BFS一定会在有限步内找到该解。但是在图搜索算法下是完备的。 阅读详情

相关推荐

带权有向图中特定路径搜索问题研究

为了记录路径的权值和边的数量,我们可以使用一个三维数组dp来保存中间结果。设表示从起点到节点u,经过i条边且边的数量为偶数时的最小路径权值;表示从起点到节点u,经过i条边且边的数量为奇数时的最小路径权值。本题通过引入边数的奇偶性约束,对传统的最短路径问题进行了拓展。通过合理定义状态和状态转移方程,结合广度优先搜索算法,我们可以有效地解决这一问题。在实际应用中,类似的约束条件可能会出现在各种网络优化问题中,掌握这种问题的解决方法有助于我们更好地应对复杂的实际情况。

jarfg35的博客 652

常见路径搜索算法(DFS,贪心,BFS,Dijkstra,A*,D*)总结

从DFS和BFS开始的路径搜索

妖米的博客 5613

记忆化搜索在网格路径问题中的应用:从入门到精通

你是否遇到过这样的问题:在一个m行n列的网格里,从左上角走到右下角(只能向右或向下走),有多少种不同的路径?直接用递归计算时,程序跑了半天没结果?这就是典型的“网格路径问题”,而记忆化搜索正是解决这类问题的关键技术。记忆化搜索的核心原理网格路径问题的数学模型从暴力递归到记忆化搜索的优化过程带障碍物、带权重等进阶场景的解法本文将按照“故事引入→核心概念→数学模型→代码实战→进阶应用”的逻辑展开,用“超市找出口”的生活案例贯穿始终,确保每个步骤都能“可视化理解”。

AI 算法实战派 952

基于搜索的路径寻找方法(Dijkstra, A*和Jump Point Search)

对解空间的定义 先看我们会遇到的一个问题。上图描述了在地图中不同机器人的形状和尺寸。因为形状和尺寸的差异让碰撞检测问题变得非常复杂。很自然我们会想能不能仅用一个点来描述机器人呢?忽略掉形状和尺寸的差异。这大大减小了路径寻找的复杂度。所以有了下图描述的解决方案。 黑色块为障碍物,包裹在障碍物周围的是根据机器人形状大小生成的膨胀层。对于复杂的机器人形状则通常使用简单的形状去近似。而机器人在地图中就...

首飞的博客 4745

Python搜索算法路径规划问题

鱼弦:优快云内容合伙人、优快云新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

走向CTO的路上... 1396

广度优先搜索在最短路径问题中的应用

在计算机科学和网络理论中,最短路径问题(Shortest Path Problem)是图论领域的一个经典问题,它要求在图的众多路径中找到两点间的最短路径。本问题不仅在理论上具有重要的地位,而且在实际应用中也极为广泛,如网络路由、地图导航、社交网络分析等。广度优先搜索是一种用于树或图的遍历或搜索算法。它的核心思想是从起始节点开始,首先访问所有相邻的节点,接着依次访问这些节点的邻居,直到遍历所有可达节点为止。这种算法可以确保搜索过程按照距离起始点的步数递增进行。

weixin_42527589的博客 509

路径搜索算法整理(一)图搜索篇

本文主要整理各种主流路径搜索算法的帖子。

weixin_45534376的博客 1560

IDEA集成selenium自动化测试(Java+Selenuim+testNG+Maven)

文章目录写在前面01 | 新建Maven项目02 | idea集成Selenium03 | 写在前面 因为软件测试的需求和博主比较经常使用Java,于是,想在Idea中集成selenuim,用Java编写测试代码,因此有了这篇文章来记录一下过程。 资源指路: java使用selenium实现模拟浏览器操作API大全 模拟登录 TestNG入门教程 感谢上面博客的大佬。 01 | 新建Maven项目 不使用骨架创建,直接点击左侧Maven,然后一路next即可。 02 | idea集成Sele

aLinxi的博客 8279

搜索算法练习——路径搜索问题

路径搜索问题:在给定的地图或图中,查找两个节点之间的最短路径或所有可能的路径。我们分别使用广度优先搜索(BFS)和深度优先搜索(DFS)来解决路径搜索问题,即查找给定图中两个节点之间的最短路径或所有可能的路径。首先,我们需要定义一个图的表示方法。在本例中,我们仍然使用邻接表来表示图。

SmiledrinkCat的博客 498

从零到一:手把手部署用友T3标准版11.2及SQL Server 2008R2环境

本文详细介绍了从零开始部署用友T3标准版11.2及SQL Server 2008R2环境的完整流程,包括环境准备、SQL Server安装、环境检测与修复、T3标准版安装实战以及初始化配置与测试。通过手把手的步骤指导和常见问题解决方案,帮助用户顺利完成部署,确保系统稳定运行。

weixin_28339967的博客 454

Cibersort免疫浸润 --- 详细教程

免疫浸润是指免疫细胞如淋巴细胞、浆细胞、巨噬细胞等进入到组织或器官中,并在这些组织或器官中发挥免疫功能的过程。免疫细胞的浸润可以是炎症反应的一部分,也可以是针对感染、肿瘤或其他疾病的免疫应答的一部分。免疫浸润通过调节免疫反应和炎症反应的程度和类型,起到维护机体免疫平衡和清除异常细胞或病原体的作用。在某些情况下,免疫浸润可能导致炎症反应过度,引起组织损伤,例如自身免疫性疾病。因此,免疫浸润在许多疾病的诊断和治疗中都具有重要的意义。免疫浸润可以通过组织切片染色和免疫组织化学等方法观察和分析。

ZxVSaccount的博客 9107

禁忌搜索算法求解考虑二维装箱的车辆路径问题

之前和大家介绍了二维装箱问题、考虑二维装箱的车辆路径问题(2L-VRP),本篇推文算是前几篇推文的综合体,将介绍如何用禁忌搜索算法求解考虑二维装箱的车辆路径问题。禁忌搜索算法(Tabu Search,简称TS)起源于对于人类记忆功能的模仿,是一种元启发式算法。它从一个初始可行解出发,试探一系列的特定搜索方向,选择让特定的目标函数值提升最多的移动。

eternal1995的博客 1433

基因家族扩张收缩分析可视化(CAFE5)

CafePlotter 是一个用于可视化 CAFE5 基因家族扩张收缩分析结果的 Python 工具

xuzhougeng blog 3637

python搜索路径顺序_Python模块搜索路径问题

I am trying to work on a dev environment but am find problems in that python seems to be using modules from the site-packages directory. I want it to be using the modules from my dev directory.sys.pat...

weixin_39856269的博客 143

Labview 机器视觉(4)之 图像处理进阶 - 动态ROI与批量保存

本文深入探讨了LabVIEW机器视觉中动态ROI与批量保存两大进阶技术。动态ROI通过模式匹配或粒子分析实现检测区域的自动追踪,解决了产品位置变化带来的挑战。同时,文章详细介绍了如何设计高效的文件命名规则与异步保存机制,以实现海量图像数据的批量保存与管理,从而构建稳定、高效的工业自动化检测系统。

weixin_29234423的博客 219

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

迷宫问题——路径搜索(BFS,DEQUE)

每个方格要么是可以通过的空方格 ‘0’ ,要么是不可通过的墙方格 ‘1’,特别的,网格的四周都是墙方格,你可以沿着空方格上下左右随意移动:从 (x,y) 向上移动一格即抵达 (x−1,y)) 、向下移动一格即抵达 (x+1,y) 、向左移动一格即抵达 (x,y−1) 、向右移动一格即抵达 (x,y+1)。现在,你位于迷宫的入口 (0,0) ,想要前往终点 (h−1,w−1)。请输出一条从起点到终点的可行路径。directions = [(-1,0),(1,0),(0,1),(0,-1)]#上下左右。

weixin_56636520的博客 948

AgentScope实战训练营-Java开发HITL人机协作AI应用完整指南

本文手把手带你从零搭建一个基于 Spring Boot WebFlux + AgentScope + 通义千问的人机协作(HITL)AI 聊天应用。项目涵盖流式对话、工具调用、高危操作确认、对话中断、动态 MCP 工具接入、中英文双语界面等完整功能。文章从环境准备、pom.xml 配置、DTO 数据模型、Hook 机制、AgentService 核心服务、ChatController 接口到前端 HTML/CSS/JS 实现,逐一讲解每行代码的设计意图,并附带 REST API 接口说明、测试场景、常见问题

program哲学 713

深度优先搜索解决迷宫最短路径问题

在之前的文章里我们介绍了深度优先遍历的思想,并且以数组全排列为例子实现了算法编码,本篇我们通过深度优先搜索解决迷宫路径问题。用程序实现查询所有从迷宫入口到终点的路径,需要越过障碍物,并且不能超出迷宫界限。 ...

Leaderxin的博客 5847

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python 模块路径搜索_Python模块搜索路径问题

我在使用python的一个目录中发现了一些问题。我希望它使用我的dev目录中的模块。在在系统路径返回一堆dir,像这样['', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-ol...

weixin_33146151的博客 216

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真

随着研究的深入,学者们对禁忌搜索算法进行了诸多改进,如改进禁忌列表的结构、动态调整禁忌长度等,以提高算法的性能。例如,在 TSP 中,如果刚刚交换了城市和城市的访问顺序,那么在禁忌列表规定的禁忌期内,禁止再次交换这两个城市的顺序。简单来说,给定一组城市和城市之间的距离,旅行商需要从一个城市出发,访问每个城市恰好一次,最后回到起始城市,目标是找到总路程最短的路线。例如,在 TSP 中,如果一个被禁忌的城市交换操作能够产生一个比当前找到的最优解还要好的解,那么根据藐视准则,算法可以执行这个操作。

熟悉python,matlab,C,C++,JAVA等 1153

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

解决搜索路径的问题 (Command not found)

解决搜索路径的问题 (Command not found)

819

【路径规划】非垄断搜索算法求解二维栅格路径规划问题

本文基于非垄断搜索算法(Non-Dominant Search Algorithm, NDSA)解决了二维栅格路径规划问题。通过NDSA的多样性搜索策略,算法能够在障碍物密集的环境中快速找到从起点到终点的最优路径。实验结果表明,该算法具有较高的搜索效率和较好的全局优化能力,适合应用于复杂环境下的路径规划问题。

2401_84610415的博客 924

路径寻找问题(状态空间搜索)

ACM学习笔记DAY18路径寻找问题(状态空间搜索)和上一小节的回溯法有很大的不同回溯法有明确的限制条件,只需找出满足条件下的一个解/所有解,也就是说这个相对明确的限制条件是回溯法得以“终止深究而回溯”的判定标准;而状态空间搜索就要模糊的多,一般是要找到一个从初始状态到终止状态的最优路径,而不是像回溯法一样找一个符合要求的解,而且“最优”是同类间的比较而非某些限制条件所规定。...

m0_65305142的博客 635
上一篇: 最大子数组和系列
下一篇: 几个子数组问题的相互转换
binling
博客等级 码龄25年 21粉丝 235原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值