有向无环图中一个节点的所有祖先(Lc2192)——BFS

给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。

给你一个二维整数数组 edges ,其中 edges[i] = [fromi, toi] 表示图中一条从 fromi 到 toi 的单向边。

请你返回一个数组 answer,其中 answer[i]是第 i 个节点的所有 祖先 ,这些祖先节点 升序 排序。

如果 u 通过一系列边,能够到达 v ,那么我们称节点 u 是节点 v 的 祖先 节点。

示例 1:

输入: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 有 2 个祖先 0 和 1 。
- 节点 4 有 2 个祖先 0 和 2 。
- 节点 5 有 3 个祖先 0 ,1 和 3 。
- 节点 6 有 5 个祖先 0 ,1 ,2 ,3 和 4 。
- 节点 7 有 4 个祖先 0 ,1 ,2 和 3 。

示例 2:

输入: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 有 1 个祖先 0 。
- 节点 2 有 2 个祖先 0 和 1 。
- 节点 3 有 3 个祖先 0 ,1 和 2 。
- 节点 4 有 4 个祖先 0 ,1 ,2 和 3 。

提示:

  • 1 <= n <= 1000
  • 0 <= edges.length <= min(2000, n * (n - 1) / 2)
  • edges[i].length == 2
  • 0 <= fromi, toi <= n - 1
  • fromi != toi
  • 图中不会有重边。
  • 图是 有向 且 无环 的。

问题简要描述:返回有向无环图中节点的所有祖先 

细节阐述:

  1.  g[i] 表示节点 i 的所有后继节点

Java 

class Solution {
    List<List<Integer>> ans;
    List<Integer>[] g;
    int n;    
    public List<List<Integer>> getAncestors(int n, int[][] edges) {
        this.n = n;
        ans = new ArrayList<>();
        g = new List[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for (int i = 0; i < n; i++) {
            ans.add(new ArrayList<>());
        }
        for (int[] e : edges) {
            g[e[0]].add(e[1]);
        }
        for (int i = 0; i < n; i++) {
            bfs(i);
        }
        return ans;
    }

    void bfs(int i) {
        boolean[] vis = new boolean[n];
        Deque<Integer> deque = new ArrayDeque<>();
        deque.add(i);
        vis[i] = true;
        while (!deque.isEmpty()) {
            int x = deque.poll();
            for (int y : g[x]) {
                if (!vis[y]) {
                    vis[y] = true;
                    ans.get(y).add(i);
                    deque.add(y);
                }
            }
        }
    }
}

 Python3

class Solution:
    def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
        def bfs(i: int):
            q = deque()
            q.append(i)
            vis = {i}
            while q:
                x = q.popleft()
                for y in g[x]:
                    if y not in vis:
                        vis.add(y)
                        q.append(y)
                        ans[y].append(i)

        g = defaultdict(list)
        for u, v in edges:
            g[u].append(v)
        ans = [[] for _ in range(n)]
        for i in range(n):
            bfs(i)
        return ans        

TypeScript

function getAncestors(n: number, edges: number[][]): number[][] {
    let g = Array.from({length: n}, () => []);
    let ans = Array.from({length: n}, () => []);
    for (const [u, v] of edges) {
        g[u].push(v);
    }
    const bfs = (i: number) => {
        const q = [i];
        const vis = Array.from({length: n}, () => false);
        vis[i] = true;
        while (q.length) {
            let x = q.pop();
            for (const y of g[x]) {
                if (!vis[y]) {
                    vis[y] = true;
                    q.push(y);
                    ans[y].push(i);
                }
            }
        }
    }
    for (let i = 0; i < n; i++) {
        bfs(i);
    }
    return ans;
};

 

相关推荐

  1. 2192. 一个节点所有祖先

    2024-04-14 11:14:01       8 阅读
  2. BFS(c++题解)

    2024-04-14 11:14:01       16 阅读
  3. DAG()-入门基础

    2024-04-14 11:14:01       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-14 11:14:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-14 11:14:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-14 11:14:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-14 11:14:01       18 阅读

热门阅读

  1. MySQL基础教程(第二部分)

    2024-04-14 11:14:01       23 阅读
  2. Mysql入门基础教程(第一部分)

    2024-04-14 11:14:01       14 阅读
  3. python 解析json

    2024-04-14 11:14:01       15 阅读
  4. Golang ProtoBuf 初学者完整教程:安装

    2024-04-14 11:14:01       19 阅读
  5. LC 53.最大子数组和

    2024-04-14 11:14:01       18 阅读
  6. vue-element-admin中使用mock数据和真实接口同时存在

    2024-04-14 11:14:01       16 阅读
  7. react异步组件如何定义使用 标准使用方法

    2024-04-14 11:14:01       21 阅读
  8. 【React Router】路由搭建

    2024-04-14 11:14:01       19 阅读
  9. LeetCode热题Hot100 - 括号生成

    2024-04-14 11:14:01       14 阅读
  10. 数据仓库—数据仓库的特征

    2024-04-14 11:14:01       13 阅读
  11. jquery删除一个页面元素动画特效

    2024-04-14 11:14:01       20 阅读
  12. 旺旺照妖镜api接口

    2024-04-14 11:14:01       16 阅读