路径搜索问题

路径规划——搜索算法详解(一):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

ansys workbench 静力结构分析 高阶教程

ansys workbench 静力结构分析 高阶教程 目录ansys workbench 静力结构分析 高阶教程新建工程模型导入设置材料模型简化: 主要内容: 材料设置、模型简化、网格细化、约束分析、接触设置、求解设置、报错处理、结果分析 基础教程: ansys workbench 静力结构分析 基础操作流程(入门) ansys版本: 19.0(16.0及以上均可) 参考资料: 推荐教学视频《有限元分析 张晔》(超详细 ???? )、ansys workbench 超级学习手册(查阅用) 说明:一些基

weixin_43434624的博客 5万+

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

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

SmiledrinkCat的博客 498

ECU诊断功能测试:从理论到实践

ECU诊断功能是指通过特定的诊断协议与ECU进行通信,以获取ECU的状态信息、故障码、数据流等,并执行特定的诊断操作。诊断功能的主要目的是帮助开发人员和维修人员快速定位和解决ECU中的问题,确保车辆的安全性和可靠性。UDS协议是ISO 14229标准的一部分,定义了一系列的诊断服务,如读取故障码、清除故障码、读取数据流等。UDS协议基于CAN(Controller Area Network)总线,具有较高的灵活性和扩展性。读取故障码是诊断功能中最基本的操作之一。通过读取故障码,可以快速定位ECU中的问题。

闲人编程的博客 1807

uniapp [安卓苹果App端] - 实现APP开发后台保活+息屏后台持续运行效果,强制后台保活手机黑屏后进程存活后台保持网络连接或持续定位等功能提供支持(app后台运行休眠仍然可以确保一直运行)

uniapp APP开发后台保活,Uniapp-APP后台保活插件(安卓苹果ios后台保活)保证应用在后台继续运行,uniapp实现app保活 保后台运行 避免系统主动杀进程,如何让安卓APP一直在后台运行?uniapp 安卓 APP 后台持续运行(保活)iOS App后台保活,Android 后台运行白名单实现保活,保活息屏后台运行,uniapp后台保活,uniapp熄屏 后台运行,Android/ios进程保活/息屏后后台保持定位、网络运行,uniapp在android ios保活,挂后台可运行,安卓A

🏆 前端领域优质创作者 1万+

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

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

eternal1995的博客 1433

升级conda时出现Malformed version string invalid chars错误解决方案

但有时,当你使用“conda upgrade”的命令时,你可能会遇到一个错误,提示你的环境解析失败,出现“Malformed version string invalid chars”错误消息。如果以上两个步骤都没有解决你的问题,那么你可以考虑更新conda的依赖项。如果你的conda版本已经是最新的,那么你需要清理conda的缓存。最后,如果以上方法都无法解决问题,你可以尝试使用pip进行更新。如果你的conda版本过旧,你需要先更新conda。首先,你需要确认你当前使用的conda版本。

BUG?不存在的! 1409

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

LearningToRank(LTR)排序算法LGBMRanker的原理和使用

1. 写在前面 在最近新闻推荐的比赛中, 接触到了一个排序模型LGBMRanker, 该模型与普通的分类模型LGBMClassifier不太一样, 普通的分类模型在进行推荐的时候, 往往是先预测某个商品或者文章用户会不会点击, 也就是它的目标是预测用户点击某篇文章或者某个商品的概率, 然后根据这个概率值进行排序, 排完之后,把最靠前的几个返回回来给用户进行推荐。 而LGBRanker模型, 它不关心用户点击某篇文章的概率, 而是根据用户点击或者不点击的这个行为, 直接去预测最后商品或者文章的一个相对顺序,

Miracle8070 1万+

yolov11添加P2小目标检测头与添加P6超大目标检测头

本文介绍了YOLO目标检测模型中上下采样的原理及应用。上采样通过插值算法放大特征图,YOLO通常采用最近邻插值;下采样则通过带步长的卷积缩小特征图提取高层语义特征。文章详细阐述了这两种操作在YOLO中的实现方式、结构特点及对称性问题,指出下采样后会使用C3模块进行特征整合,上采样后通过concat抑制分割感。此外,还分析了不同分辨率特征图适合检测不同尺寸目标的原因,并提出添加4倍小目标检测头的方法,即对上采样后的特征进行concat和C3模块处理。最后给出了YOLOv5原模型结构和添加4倍检测头后的结构对比

m0_64661770的博客 820

迷宫问题——路径搜索(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

在 SAP S/4HANA 分析模型中添加 Measures,Calculated、Restricted、Currency Conversion 与 Unit Conversion 的建模思路

摘要: SAP S/4HANA分析查询建模中,度量(measure)的加工层级是关键难点,涉及聚合时机、币种/单位语义、过滤上下文等复杂因素。度量不仅是数字字段,还需处理计算口径(Calculated Measures)、上下文绑定(Restricted Measures)和单位转换等问题。Calculated Measures适合派生指标(如毛利率),需注意聚合前后计算差异;Restricted Measures通过固化过滤条件(如区分实际/计划金额)确保业务语义一致性。建模时应将业务逻辑下沉到分析模型层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1022

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

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

Leaderxin的博客 5847

llama.cpp 参数调优大全(4060 最优配置)

本文针对NVIDIA RTX 4060(8GB显存)显卡,提供了llama.cpp参数调优的实战指南。核心策略是采用小模型(7B/8B)配合Q4_K_M量化,通过合理设置GPU层数(-ngl 28)、上下文长度(-c 2048)和批量大小(-b 512)来平衡性能和显存占用。重点推荐启用flash-attn加速和mlock内存锁定,并给出标准、高性能和保守三种配置方案。调优优先级为:GPU利用率>吞吐量>显存>线程数,同时警示避免常见错误如过大上下文或GPU层数设置。最终推荐4060最佳配置为7B Q4_

刘一说的IT专栏 3402

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

解决搜索路径的问题 (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、付费专栏及课程。

余额充值