首頁 > 後端開發 > php教程 > 有向無環圖中節點的所有祖先

有向無環圖中節點的所有祖先

WBOY
發布: 2024-07-17 19:34:52
原創
492 人瀏覽過

2192。有向無環圖中某個節點的所有祖先

給定一個正整數 n,表示有向無環圖 (DAG) 的節點數。節點編號從 0 到 n - 1(包含)。

還給你一個2D 整數數組Edge,其中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 有 3 個祖先: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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板