首页 >后端开发 >php教程 >有向无环图中节点的所有祖先

有向无环图中节点的所有祖先

WBOY
WBOY原创
2024-07-17 19:34:52463浏览

2192。有向无环图中某个节点的所有祖先

给定一个正整数 n,表示有向无环图 (DAG) 的节点数。节点编号从 0 到 n - 1(包含)。

还给你一个 2D 整数数组 Edges,其中 Edges[i] = [fromi, toi] 表示存在一个 单向图中从 fromi 到 toi 的边。

返回列表答案,其中answer[i]是第i节点的祖先列表,按升序排序。

如果 u 可以通过一组边到达 v,则节点 u 是另一个节点 v 的祖先

示例1:

All Ancestors of a Node in a Directed Acyclic Graph

  • 输入: n = 8,edgeList = [[0,3],[0,4],[1,3],[2,4],[2,7],[3,5] ,[3,6],[3,7],[4,6]]
  • 输出: [[],[],[],[0,1],[0,2],[0,1,3],[0,1,2,3,4], [0,1,2,3]]
  • 说明:上图表示输入图。
    • 节点 0、1 和 2 没有任何祖先。
    • 节点 3 有两个祖先 0 和 1。
    • 节点 4 有两个祖先 0 和 2。
    • 节点 5 有三个祖先 0、1 和 3。
    • 节点 6 有 5 个祖先:0、1、2、3 和 4。
    • 节点 7 有四个祖先 0、1、2 和 3。

示例2:

All Ancestors of a Node in a Directed Acyclic Graph

  • 输入: n = 5,edgeList = [[0,1],[0,2],[0,3],[0,4],[1,2],[1,3] ,[1,4],[2,3],[2,4],[3,4]]
  • 输出: [[],[0],[0,1],[0,1,2],[0,1,2,3]]
  • 说明:上图表示输入图。
    • 节点 0 没有任何祖先。
    • 节点 1 有一个祖先 0。
    • 节点 2 有两个祖先 0 和 1。
    • 节点 3 有三个祖先 0、1 和 2。
    • 节点 4 有四个祖先:0、1、2 和 3。

约束:

  • 1
  • 0
  • 边[i].length == 2
  • 0 i,到i
  • i != 到i
  • 没有重复的边。
  • 该图是有向无环

解决方案:

class Solution {

    /**
     * @param Integer $n
     * @param Integer[][] $edges
     * @return Integer[][]
     */
    function getAncestors($n, $edges) {
        $adjacencyList = array_fill(0, $n, []);
        foreach ($edges as $edge) {
            $from = $edge[0];
            $to = $edge[1];
            $adjacencyList[$to][] = $from;
        }

        $ancestorsList = [];

        for ($i = 0; $i < $n; $i++) {
            $ancestors = [];
            $visited = [];
            $this->findChildren($i, $adjacencyList, $visited);
            for ($node = 0; $node < $n; $node++) {
                if ($node == $i) continue;
                if (in_array($node, $visited))
                    $ancestors[] = $node;
            }
            $ancestorsList[] = $ancestors;
        }

        return $ancestorsList;
    }

    private function findChildren($currentNode, &$adjacencyList, &$visitedNodes) {
        $visitedNodes[] = $currentNode;
        foreach ($adjacencyList[$currentNode] as $neighbour) {
            if (!in_array($neighbour, $visitedNodes)) {
                $this->findChildren($neighbour, $adjacencyList, $visitedNodes);
            }
        }
    }
}

联系链接

  • 领英
  • GitHub

以上是有向无环图中节点的所有祖先的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn