PHP多维数组中最多经2个节点的路径查找最优方案咨询
嘿,这个问题挺有意思的!咱们先把需求理清楚:你要找的是两点间最多经过2个中间节点的路径,换句话说,路径的总节点数最多是4(起点 + 2个中间节点 + 终点),对应的边数最多是3条。结合你给出的邻接表结构,咱们可以用非常直接且高效的方式实现,比通用的DFS/BFS更轻量化。
核心思路:分层检查邻接节点
因为路径长度被严格限制在最多3步(经过2个中间节点),咱们可以直接按路径长度从小到大逐层检查,一旦找到符合条件的路径就可以立即返回(如果只需要一条),或者收集所有符合条件的路径。具体分四种情况:
- 情况1:起点和终点是同一个节点(零经过节点)
- 情况2:起点和终点直接相连(经过0个中间节点)
- 情况3:经过1个中间节点(总边数2)
- 情况4:经过2个中间节点(总边数3)
这种方法的优势是没有多余的遍历开销,不需要维护队列、访问标记等额外结构,完全针对你的需求定制,效率是最优的。
代码实现(PHP)
如果你只需要找到任意一条符合条件的路径,可以用这个版本:
function findPathMaxTwoIntermediates($graph, $start, $end) { // 情况1:起点就是终点 if ($start === $end) { return [$start]; } // 情况2:直接相连(0个中间节点) if (isset($graph[$start]) && in_array($end, $graph[$start])) { return [$start, $end]; } // 情况3:经过1个中间节点 foreach ($graph[$start] ?? [] as $mid1) { if (isset($graph[$mid1]) && in_array($end, $graph[$mid1])) { return [$start, $mid1, $end]; } } // 情况4:经过2个中间节点 foreach ($graph[$start] ?? [] as $mid1) { foreach ($graph[$mid1] ?? [] as $mid2) { if (isset($graph[$mid2]) && in_array($end, $graph[$mid2])) { return [$start, $mid1, $mid2, $end]; } } } // 没有符合条件的路径 return null; } // 测试你的示例 $array = [ 'A' => ['B','X1','X2'], 'B' => ['C','X3','X4'], 'C' => ['D','X5','X6'], ]; var_dump(findPathMaxTwoIntermediates($array, 'A', 'D')); // 输出 ['A','B','C','D']
如果需要收集所有符合条件的路径,只需要把“立即返回”改成“收集路径”即可:
function findAllPathsMaxTwoIntermediates($graph, $start, $end) { $paths = []; if ($start === $end) { $paths[] = [$start]; } // 直接相连的路径 if (isset($graph[$start]) && in_array($end, $graph[$start])) { $paths[] = [$start, $end]; } // 经过1个中间节点的路径 foreach ($graph[$start] ?? [] as $mid1) { if (isset($graph[$mid1]) && in_array($end, $graph[$mid1])) { $paths[] = [$start, $mid1, $end]; } } // 经过2个中间节点的路径 foreach ($graph[$start] ?? [] as $mid1) { foreach ($graph[$mid1] ?? [] as $mid2) { if (isset($graph[$mid2]) && in_array($end, $graph[$mid2])) { $paths[] = [$start, $mid1, $mid2, $end]; } } } return $paths; }
为什么这是最优方案?
- 时间开销最小:因为咱们只遍历最多3层邻接节点,不会去碰超出需求范围的节点,对于大型图来说,比通用的BFS/DFS节省大量资源。
- 逻辑简洁易懂:完全贴合你的“最多经过2个中间节点”的需求,没有冗余的通用算法逻辑。
- 无额外内存开销:不需要维护队列、访问集合等结构,内存占用极低。
内容的提问来源于stack exchange,提问作者sarotnem
相关产品推荐
相关产品推荐

