You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

为什么这是最优方案?

  1. 时间开销最小:因为咱们只遍历最多3层邻接节点,不会去碰超出需求范围的节点,对于大型图来说,比通用的BFS/DFS节省大量资源。
  2. 逻辑简洁易懂:完全贴合你的“最多经过2个中间节点”的需求,没有冗余的通用算法逻辑。
  3. 无额外内存开销:不需要维护队列、访问集合等结构,内存占用极低。

内容的提问来源于stack exchange,提问作者sarotnem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:23:17