首页 > 其他分享 >802.找到最终的安全状态 (Medium)

802.找到最终的安全状态 (Medium)

时间:2023-06-13 16:46:14浏览次数:54  
标签:Medium 找到 graph in0 int vector res 802 节点

问题描述

802. 找到最终的安全状态 (Medium)

有一个有 n 个节点的有向图,节点按 0n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph 表示, graph[i] 是与节点 i 相邻的节点的整数数组,这意味着从节点 igraph[i] 中的每个节点都有一条边。

如果一个节点没有连出的有向边,则它是 终端节点 。如果没有出边,则节点为终端节点。如果从该节点开始的所有可能路径都通向 终端节点 ,则该节点为 安全节点

返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。

示例 1:

Illustration of
graph

输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
输出:[2,4,5,6]
解释:示意图如上。
节点 5 和节点 6 是终端节点,因为它们都没有出边。
从节点 2、4、5 和 6 开始的所有路径都指向节点 5 或 6 。

示例 2:

输入:graph = [[1,2,3,4],[1,2],[3,4],[0,4],[]]
输出:[4]
解释:
只有节点 4 是终端节点,从节点 4 开始的所有路径都通向节点 4 。

提示:

  • n == graph.length
  • 1 <= n <= 10⁴
  • 0 <= graph[i].length <= n
  • 0 <= graph[i][j] <= n - 1
  • graph[i] 按严格递增顺序排列。
  • 图中可能包含自环。

解题思路

典型的拓扑排序题,但一般的拓扑排序是考虑节点的入度,这里我们需要改为考虑节点的出度,对应的res即为所求。

代码

class Solution {
public:
    vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
        // 拓扑排序,bfs
        int n = graph.size();
        vector<int> in_arr(n);
        for (int i = 0; i < n; ++i) {
            for (int v : graph[i]) {
                in_arr[v]++;
            }
        }
        std::queue<int> in0;
        for (int i = 0; i < n; ++i) {
            // 将入度为0的点放入in0
            if (in_arr[i] == 0) {
                in0.push(i);
            }
        }
        vector<int> res;
        while (!in0.empty()) {
            int idx = in0.front();
            // 从in0中取一个点放入res
            res.push_back(idx);
            in0.pop();
            for (auto v : graph[idx]) {
                if (--in_arr[v] == 0) {
                    in0.push(v);
                }
            }
        }
        return res;
    }
};

标签:Medium,找到,graph,in0,int,vector,res,802,节点
From: https://www.cnblogs.com/zwyyy456/p/17478036.html

相关文章

  • 2718. 查询后矩阵的和 (Medium)
    问题描述2718.查询后矩阵的和(Medium)给你一个整数n和一个下标从0开始的二维数组queries,其中queries[i]=[typeᵢ,indexᵢ,valᵢ]。一开始,给你一个下标从0开始的nxn矩阵,所有元素均为0。每一个查询,你需要执行以下操作之一:如果typeᵢ==0,将第index......
  • 28.找出字符串中第一个匹配项的下标 (Medium)
    问题描述28.找出字符串中第一个匹配项的下标(Medium)给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad......
  • 373. 查找和最小的 K 对数字 (Medium)
    问题描述373.查找和最小的K对数字(Medium)给定两个以升序排列的整数数组nums1和nums2,以及一个整数k。定义一对值(u,v),其中第一个元素来自nums1,第二个元素来自nums2。请找到和最小的k个数对(u₁,v₁),(u₂,v₂)...(uₖ,vₖ)。示例1:输入:nums1......
  • 都说DevOps落地难,到底难在哪里?也许你还没找到套路
    当你打开这篇文章的时候,也许你也在为DevOps的落地而苦恼,也许你的组织正在尝试DevOps转型,作为一线的实践者,说说我对这个“落地难”的看法,欢迎交流不同看法~DevOps是实践摸索出来的,别人的终究是别人的如下图所示,你可能在不同企业研发效能的分享都看到过,各种关于DevOps的书上有会提到De......
  • 根据端口找到进程pid
    [root@localhostluban]#netstat-anp|grep"8999"tcp600:::8999:::*LISTEN93234/./luban#这里的93234就是占用8999端口进程的pid[root@localhostluban]#ps-ef|greplubanroot9323491770016:......
  • 所以,找到实习的朋友在哪投的简历?
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!今明两天高考,学长先在这祝福所有考生考出理想成绩!马上就要暑假了,不少人准备考研、准备实习,各有目标,不过,有的同学还不知道在哪投简历?今天学长就带大家走进科学,看看实习的简历都......
  • 【每日一题】LeetCode 438.找到字符串中所有字母异位词
    题目给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。输入:s=“cbaebabacd”,p=“abc”输出:[0,6]解释:起始索引等于0的子串是“cba”,它是“abc”......
  • 架构师如何找到自己的商业模式
    作为一个架构师,必须要在有限的资源下最大化架构活动所带来的商业价值。对于任何一个架构活动而言,架构师的可用资源,包括商业成本、研发成本、时间成本、迁移成本等等,都是非常有限的。但架构活动就是要在这些限制条件之下,将商业价值最大化。商业价值(Businessvalue)呢,就是从现金收......
  • PS3111固件找到了,贴一个Phison自封颗粒的PS3111 512GB的硬盘
    硬盘是我在某鱼花了70块钱包邮淘的坏盘,颗粒封装是群联自封的,看ID却是凯侠的BICS3(纯正群联自封TSBBiCS3,T开头是东芝,C开头才是长江)盘是神舟笔记本上面的坏盘,主控是PS5008,短命的主控,协议速度是pcie3.0x2。拆下颗粒,植球,找一个mSATA的PS3111空板,全部焊接上去。完成品,准备开卡。先清空fl......
  • xades4j 苦苦寻找的是啥 (源码 == 找到了测试用例 == 找到了用法)
    <dependency><groupId>com.googlecode.xades4j</groupId><artifactId>xades4j</artifactId><version>1.3.2</version></dependency>https://github.com/luisgoncalves/xades4j源码和junit(大量的测试用例,告诉我们什么是xades......