(leetcode802,拓扑排序,深搜+三色标记)-------------------Java实现

news2024/11/19 13:14:37

(leetcode802,拓扑排序,深搜+三色标记)找到最终的安全状态-------------------Java实现

题目表述

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

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

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

样例

在这里插入图片描述
(上图)输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
输出:[2,4,5,6]

输入:graph = [[1,2,3,4],[1,2],[3,4],[0,4],[]]
输出:[4]

条件

n == graph.length
1 <= n <= 104
0 <= graph[i].length <= n
0 <= graph[i][j] <= n - 1
graph[i] 按严格递增顺序排列。
图中可能包含自环。
图中边的数目在范围 [ 1 , 4 ∗ 1 0 4 ] [1,4*10^4] [1,4104] 内。

思路

1、答案学习思路:深搜+三色标记法。主要思路是,根据边深搜,递归查询,发现环路之后,整条路上的其实都可以认定为不安全结点。只有所有的边都通往安全节点才是安全节点。
2、拓扑排序(容易想到)

注意点

ac代码

Java:

package leetcode802;

import java.util.*;

class Solution802 {   //拓扑排序
    public List<Integer> eventualSafeNodes(int[][] graph) {

        Set<Integer>[] Source_graph = new HashSet[graph.length];
        int[] Target_graph = new int[graph.length];
        List<Integer> result = new ArrayList<>();
        for (int i=0;i<graph.length;i++) {
            Source_graph[i] = new HashSet<>();
            Target_graph[i] = graph[i].length;
        }
        for (int i=0;i< graph.length;i++)
        for (int j=0;j<graph[i].length;j++)
            Source_graph[graph[i][j]].add(i);
        Queue<Integer> q = new ArrayDeque<>();
        for (int i=0;i<Target_graph.length;i++) {
            if (Target_graph[i]==0) {
                q.offer(i);
                result.add(i);
            }
        }
        while(!q.isEmpty()){
            int now_source = q.poll();
            for (Integer i :Source_graph[now_source])
            {
                Target_graph[i]--;
                if (Target_graph[i]==0)
                {q.offer(i);result.add(i);}
            }
        }
        Collections.sort(result);

    return result;
    }
}
class Solution802_2 {  //深搜+三色标记
    public List<Integer> eventualSafeNodes(int[][] graph) {
        int[] color = new int[graph.length];
        List<Integer> ans = new LinkedList<Integer>();
        for (int i=0;i<graph.length;i++)
            if (safe(graph,color,i))
                ans.add(i);
    Collections.sort(ans);
    return ans;
    }
    public boolean safe(int[][] graph,int[] color,int x)
    {
        if (color[x]!=0)
            return color[x]==2;
        color[x] = 1;
        for (int i:graph[x])
            if (!safe(graph,color,i))
                return false;
        color[x] = 2;
        return true;
    }
}
public class leetcode802 {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        cin.nextLine();
        int[][] graph = new int[n+1][];
        for (int i =0;i<=n;i++){
            String line = cin.nextLine();
            if (line.isEmpty()) {
             graph[i] = new int[0];
                continue;
            }
            String[] numbers = line.split(" ");
            graph[i] = new int[numbers.length];
            for (int j=0;j<numbers.length;j++)
                graph[i][j] = Integer.parseInt(numbers[j]);

            }
    cin.close();
//        Solution802 s = new Solution802();
        Solution802_2 s_2 = new Solution802_2();
//        System.out.println(s.eventualSafeNodes(graph));
        System.out.println(s_2.eventualSafeNodes(graph));
        // input
//        6
//        1 2
//        2 3
//        5
//        0
//        5



    }
}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-eventual-safe-states
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

文章目录 RPC 协议gRPCJSON-RPC 数据序列化与反序列化lua-cjsonlua-protobuf RPC 协议 在分布式计算&#xff0c;远程过程调用&#xff08;英语&#xff1a;Remote Procedure Call&#xff0c;缩写为 RPC&#xff09;是一个计算机通信协议。该协议允许运行于一台计算机的程序调…

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 目录 Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 一、简单介绍 二、OKHttp 4.xx 的 SDK 封装 aar 给 Unity 的使用注意 三、附录 OKHttp 的…

一米ip流量池系统

PC端快速切换移动网络IP 支持全网通sim卡槽&#xff0c;国内三大运营商IP池动态切换&#xff0c;实现真实移动端IP切换。从此换IP再也不用vpn或代理&#xff0c;一个设备搞定 1.兼容国内电信&#xff0c;移动&#xff0c;联通三网通的sim卡4G连接&#xff0c;快速稳定2.可直接…

《算法竞赛·快冲300题》每日一题:“简化农场”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 简…

SpringBoot自定义消息总线

一、前言 在现代的分布式系统中&#xff0c;消息传递已成为一个非常流行的模式。它使得系统内的不同部分可以松耦合地通信&#xff0c;从而实现更高效、更可靠的应用程序。本博客将介绍SpringBoot如何提供简单易用的消息传递机制&#xff0c;并展示如何自定义消息总线以满足特定…

安装使用 d3graph 时出现 TypeError 的解决方法

使用 python 3.7 pip 22.3.1 在清华镜像源 https://pypi.tuna.tsinghua.edu.cn/simple 安装 d3blocks 1.3.2 时&#xff0c;安装成功后导入包时出错&#xff1a; 观察报错信息可以看到出错的代码&#xff08;902 行&#xff09;使用了类型指定语法&#xff0c;这是最新的 pyth…

stable diffusion实践操作-电脑硬件查看

本文专门开一节写电脑硬件相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 正文 1、检查电脑显存的方法&#xff08;win10&#xff09;&#xff1a; 鼠标放在工具栏&#xff0c;单击右键打开“任务管理器”&#xff0c;选择顶…

jmeter 固定定时器

固定定时器&#xff08;Constant Timer&#xff09;是一个定时器元件&#xff0c;可以在线程组中的每个线程之间添加固定的延迟时间。固定定时器会对每个线程的执行进行一定的暂停。 聊一下和线程组中的调度器对线程组执行时长的影响&#xff1a; 相同&#xff1a; 都会影响线…

【线性代数】矩阵求导的本质与分子布局、分母布局的本质(矩阵求导——本质篇)

矩阵求导的本质与分子布局、分母布局的本质&#xff08;矩阵求导——本质篇&#xff09; 说在前面一. 函数与标量、向量、矩阵二. 矩阵求导的本质三. 矩阵求导结果的布局四. 分子布局、分母布局的本质五. 向量变元的实值标量函数 说在前面 我将严谨地说明矩阵求导的本质与分子布…

游戏思考30(补充版):关于逆水寒铁牢关副本、白石副本和技能的一些注释(2023/0902)

前期介绍 我是一名逆水寒的玩家&#xff0c;做一些游戏的笔记当作攻略记录下来&#xff0c;荣光不朽-帝霸来源视频连接 传送门 一、旧版铁牢关&#xff08;非逆水寒老兵服&#xff09; &#xff08;1&#xff09;老一&#xff1a;巨鹰 1&#xff09;机制一&#xff1a;三阵风…

多通道振弦数据记录仪应用桥梁安全监测的关键要点

多通道振弦数据记录仪应用桥梁安全监测的关键要点 随着近年来桥梁建设和维护的不断推进&#xff0c;桥梁安全监测越来越成为公共关注的焦点。多通道振弦数据记录仪因其高效、准确的数据采集和处理能力&#xff0c;已经成为桥梁安全监测中不可或缺的设备。本文将从以下几个方面…

JavaScript基础02

JavaScript 基础 文章目录 JavaScript 基础运算符算术运算符赋值运算符自增/自减运算符比较运算符逻辑运算符运算符优先级 语句表达式和语句分支语句if 分支语句if双分支语句if 多分支语句三元运算符&#xff08;三元表达式&#xff09;switch语句&#xff08;了解&#xff09;…

孙哥Spring源码第16集

第16集 refresh()-prepareBeanFactory分析 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】 1、设置类加载器 2、设置SpringEL表达式 解析器 3、设置内置的属性编辑器 &#xff08;类型转换器&#xff09; 3.1、如何实现类型转化&#xff1f; 1、Converter 2、P…

Ubuntu 20.04 Server配置网络

0&#xff0c;环境 服务器&#xff1a; Intel(R) Xeon(R) Gold 6248R CPU 3.00GHz 96核 网卡&#xff1a; 多网卡 1&#xff0c; 镜像下载 http://old-releases.ubuntu.com/releases/ubuntu-20.04.1-desktop-amd64.iso 2&#xff0c; 系统安装--具体步骤就不贴出来&#…

Navicat 强大的数据模型功能 | 面向数据库设计、架构和数据资产梳理等使用场景

数据模型是用来描述数据、组织数据和对数据进行操作的一组概念和定义。根据不同的应用需求&#xff0c;数据模型可以分为概念模型、逻辑模型和物理模型。这些数据模型帮助数据库设计人员设计和管理数据库&#xff0c;以满足用户的需求。 Navicat 强大的数据模型功能主要适用于…

Linux c++开发-03-使用CMake组织工程

一、简单文件的编译 有如下的目录结构&#xff1a; 其中 helloworld.cpp如下&#xff1a; #include <iostream> using namespace std; int main() {printf("hello world my name is Ty!");return 0; }CMakeLists.txt如下&#xff1a; cmake_minimum_requir…

cocos creator配置终端调试

在launch.json里添加"preLaunchTask":“CocosCreator compile” 在cocos creator里选择开发者&#xff0c;visual studio code工作流&#xff0c;选择添加编译任务。 添加 settings.json {"files.exclude":{"**/.git": true,"**/.DS_Sto…

数据结构与算法(三)线性表

线性表定义 线性表&#xff08;List&#xff09;&#xff1a;零个或多个数据元素的有限序列。 首先它是一个序列&#xff0c;其次&#xff0c;线性表强调是有限的。 前驱元素&#xff1a;若A元素在B元素的前面&#xff0c;则称A为B的前驱元素 后继元素&#xff1a;若B元素在…

【代码随想录day23】不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示…

明茨伯格的人际关系角色理论

明茨伯格的人际关系角色理论是由社会心理学家明茨伯格&#xff08;William Schutz&#xff09;在20世纪50年代提出的一种关于人际关系的理论。该理论主要探讨了人际关系中的三个角色&#xff1a;包容性、控制性和亲密性。这些角色代表了人们在互动中所表现出的行为和需求。下面…