反向dfs,LeetCode 192. 有向无环图中一个节点的所有祖先

news/2024/7/20 23:09:27 标签: 算法, 数据结构, leetcode, 深度优先, 职场和发展

一、题目

1、题目描述

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

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

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

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

2、接口描述

python3
class Solution:
    def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
cpp
class Solution {
public:
    vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
        
    }
};

3、原题链接

2192. 有向无环图中一个节点的所有祖先


二、解题报告

1、思路分析

注意到点数不超过1000,边数不超过2000

那么我们可以反向建图,然后对每个点进行dfs,对于遍历到的点就是原图中的ancestors

2、复杂度

时间复杂度: O(n(n + m))空间复杂度:O(n + m)

3、代码详解

python3
class Solution:
    def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
        g = [[] for _ in range(n)]
        for x, y in edges:
            g[y].append(x)
        def dfs(x: int) -> None:
            vis[x] = True
            for y in g[x]:
                if not vis[y]:
                    dfs(y)
        ret = [None] * n
        for i in range(n):
            vis = [False] * n
            dfs(i)
            vis[i] = False
            ret[i] = [j for j, x in enumerate(vis) if x]
        return ret
cpp
class Solution {
public:
    vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
        vector<vector<int>> g(n);
        for(auto& e : edges)
            g[e[1]].emplace_back(e[0]);
        vector<vector<int>> ret(n);
        vector<bool> vis(n);
        function<void(int)> dfs = [&](int x){
            vis[x] = 1;
            for(int y : g[x])
                if(!vis[y])
                    dfs(y);
        };
        for(int i = 0; i < n; i++) {
            fill(vis.begin(), vis.end(), false);
            dfs(i), vis[i] = false;
            for(int j = 0; j < n; j++)
                if(vis[j])
                    ret[i].emplace_back(j);
        }
        return ret;
    };
};


http://www.niftyadmin.cn/n/5469184.html

相关文章

【系统架构师】-第17章-通信系统架构设计

1、网络组成 1&#xff09;局域网&#xff1a;由计算机、交换机、路由器等设备组成 2&#xff09;广域网&#xff1a;由通信子网与资源子网组成&#xff0c;属于多级网络&#xff0c;通常由骨干网、分布网、接入网组成 3&#xff09;移动通信网&#xff1a;5G、边缘计算 2、…

对比传统交易模式与基于区块链的交易模式

随着科技的不断进步&#xff0c;交易模式也在持续革新。传统交易模式与基于区块链的交易模式&#xff0c;作为两种截然不同的交易方式&#xff0c;各有其特点与影响。本文将对这两种交易模式进行详尽的对比&#xff0c;从多个维度揭示它们之间的差异。 一、交易结构与中心化程…

深度强化学习调参技巧

在深度强化学习中,调参是一个非常重要的任务,它直接影响到模型的性能和收敛速度。下面是一些常用的深度强化学习调参技巧: 选择合适的环境和任务: 首先要确保选择的环境和任务适合深度强化学习。不同的环境和任务对算法的表现有着不同的要求,因此需要根据具体情况选择合适…

网络与并发编程(一)

并发编程介绍_串行_并行_并发的区别 串行、并行与并发的区别 串行(serial)&#xff1a;一个CPU上&#xff0c;按顺序完成多个任务并行(parallelism)&#xff1a;指的是任务数小于等于cpu核数&#xff0c;即任务真的是一起执行的并发(concurrency)&#xff1a;一个CPU采用时间…

Linux驱动学习:从Linux主机nfs共享文件到uboot

第一步&#xff1a;在Linux主机上开启NFS服务&#xff0c;使用如下命令安装NFS服务&#xff1a; sudo apt-get install nfs-kernel-server rpcbind 第二步&#xff1a;创建一个文件夹用于共享&#xff0c;直接以nfs命名就行&#xff1a; 第三步&#xff1a;打开nfs服务配置文…

机器学习全攻略:概念、流程、分类与行业应用案例集锦

目录 1.引言 2.从零开始认识机器学习&#xff1a;基本概念与重要术语 3.五步走&#xff1a;掌握机器学习项目执行的完整流程 3.1.问题定义与数据收集 3.2.数据预处理与特征工程 3.3.模型选择与训练 3.4.模型评估与优化 3.5.模型部署与监控 4.深入了解各类机器学习方法…

Xshell Mobaxterm等终端工具连接不上服务器,显示 SSH服务器拒绝密码。请再试一次。解决办法

问题解决办法&#xff1a; &#xff08;1&#xff09;需要查看配置SSH密钥时&#xff0c;输入的password密码和当前users_name cd /home/: 查看当前系统下的用户名 注意上图中的登录名是服务器端linux下自己设置的user_name用户名&#xff1a; 所以需要将fl改为&#xff1a…

计算机网络—TCP协议详解:特性、应用(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…