LeetCode 0924.尽量减少恶意软件的传播:连通块染色(以BFS为例)

【LetMeFly】924.尽量减少恶意软件的传播:连通块染色(以BFS为例)

力扣题目链接:https://leetcode.cn/problems/minimize-malware-spread/

给出了一个由 n 个节点组成的网络,用 n × n 个邻接矩阵图 graph 表示。在节点网络中,当 graph[i][j] = 1 时,表示节点 i 能够直接连接到另一个节点 j。 

一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。

假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。

如果从 initial 中移除某一节点能够最小化 M(initial), 返回该节点。如果有多个节点满足条件,就返回索引最小的节点。

请注意,如果某个节点已从受感染节点的列表 initial 中删除,它以后仍有可能因恶意软件传播而受到感染。

 

    示例 1:

    输入:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]
    输出:0
    

    示例 2:

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

    示例 3:

    输入:graph = [[1,1,1],[1,1,1],[1,1,1]], initial = [1,2]
    输出:1
    

     

    提示:

    • n == graph.length
    • n == graph[i].length
    • 2 <= n <= 300
    • graph[i][j] == 0 或 1.
    • graph[i][j] == graph[j][i]
    • graph[i][i] == 1
    • 1 <= initial.length <= n
    • 0 <= initial[i] <= n - 1
    • initial 中所有整数均不重复

    解题方法:连通块染色(以BFS为例)

    解题思路

    我们将所有相互连通的节点(称为连通块)染成相同的颜色,不同连通块染成不同的颜色,并记录下每个连通块的大小。

    这样,对于intial中的节点t

    • 如果存在另一节点it同色,则初始时移除该节点无意义;
    • 否则,初始时移除节点t的话,和t同色的节点都将幸免。

    具体方法

    对于连通块染色:

    • 使用数组color[i]代表节点i的颜色,初始值全为0(代表无色);
    • 使用数组color2size[i]代表颜色为i的节点的个数。

    遍历每个节点,若该节点未被染色,则发现新的连通块:

    将该节点染成一个新的颜色,创建一个队列并将该节点入队。

    队列非空时,出队一个节点,并遍历这个节点的所有相邻节点。

    若某相邻节点未被染色,则将其染成相同的颜色,并更新color2size的大小。

    时空复杂度

    • 时间复杂度 O ( l e n ( g r a p h ) 2 ) O(len(graph)^2) O(len(graph)2)
    • 空间复杂度 O ( l e n ( g r a p h ) ) O(len(graph)) O(len(graph))

    AC代码

    C++
    class Solution {
    private:int canDesc(int t, vector<int>& initial, vector<int>& color, vector<int>& color2size) {for (int i : initial) {if (color[i] == color[t] && i != t) {return 0;}}return color2size[color[t]];}
    public:int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {int cntColor = 0;vector<int> color(graph.size());vector<int> color2size(graph.size() + 1);for (int i = 0; i < graph.size(); i++) {  // begin from each nodeif (color[i]) {continue;}cntColor++;queue<int> q;q.push(i);color[i] = cntColor;color2size[cntColor]++;while (q.size()) {int thisNode = q.front();q.pop();for (int j = 0; j < graph.size(); j++) {if (graph[thisNode][j] && !color[j]) {q.push(j);color[j] = cntColor;color2size[cntColor]++;}}}}int ans, maxDesc = -1;sort(initial.begin(), initial.end());for (int t : initial) {int thisDesc = canDesc(t, initial, color, color2size);if (thisDesc > maxDesc) {maxDesc = thisDesc;ans = t;}}return ans;}
    };
    
    Python
    # from typing import Listclass Solution:def canDesc(self, t, initial, color, color2cnt) -> int:for i in initial:if color[i] == color[t] and i != t:return 0return color2cnt[color[t]]def minMalwareSpread(self, graph: List[List[int]], initial: List[int]) -> int:color = [0] * len(graph)color2cnt = [0] * (len(graph) + 1)cntColor = 0for i in range(len(graph)):if color[i]:continuecntColor += 1color[i] = cntColorcolor2cnt[cntColor] = 1q = [i]while q:thisNode = q.pop()for j in range(len(graph)):if graph[thisNode][j] and not color[j]:color[j] = cntColorcolor2cnt[cntColor] += 1q.append(j)ans, maxDesc = 0, -1initial.sort()for t in initial:thisDesc = self.canDesc(t, initial, color, color2cnt)if thisDesc > maxDesc:maxDesc = thisDescans = treturn ans
    

    同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/137815658

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

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

    相关文章

    HarmonyOS4-数据持久化

    轻量级preferences&#xff1a; 关系型数据库&#xff1a; 增删改&#xff1a; 查询语句&#xff1a; 具体详情代码可参与源码&#xff1a; 黑马大佬写的。 harmonyos-lessons: 黑马程序员B站HarmonyOS课程的基础篇代码部分

    热门的软件测试趋势趋势分析

    放眼全球&#xff0c;了解技术发展的边界和趋势&#xff0c;有助于组织和个人的发展及竞争力的提升&#xff0c;偶尔看到国外某网站的一篇文章&#xff0c;读来颇值得参考&#xff0c;简单翻译过来&#xff0c;分享一下。 也许这篇文章会给你一份指南&#xff0c;让你快速成长…

    【电路笔记】-数字缓冲器

    数字缓冲器 文章目录 数字缓冲器1、概述2、单输入数字缓冲器3、三态缓冲器3.1 有效“高”三态缓冲器3.2 有效“高”反相三态缓冲器3.3 有效“低”三态缓冲器3.4 有效“低”反相三态缓冲器4、三态缓冲器控制数字缓冲器和三态缓冲器可以在数字电路中提供电流放大以驱动输出负载。…

    【uniapp】request请求函数封装,token、成功、失败等

    1、封装http.ts //utils--->http.ts/*** 添加拦截器* 拦截request请求* 拦截uploadFile文件上传** TODO* 1、非http开头需要拼接地址* 2、请求超时* 3、添加小程序端请求头标识* 4、添加token请求头标识*/ import { useMemberStore } from /stores/index const member…

    C语言学习/复习20

    一、调试 1.实例1&#xff1a; 经调试&#xff0c;该代码因数组越界会死循环 二、优秀的代码 注意事项&#xff1a;assert()返回真假并决定是否报错 常量指针本质是指针&#xff0c;常量修饰它&#xff0c;表示这个指针是一个指向常量的指针&#xff08;变量&#xff09…

    MySQL 基础使用

    文章目录 一、Navicat 工具链接 Mysql二、数据库的使用1.常用数据类型2. 建表 create3. 删表 drop4. insert 插入数据5. select 查询数据6. update 修改数据7. delete 删除记录truncate table 删除数据 三、字段约束字段1. 主键 自增delete和truncate自增长字段的影响 2. 非空…

    Tomcat 获取客户端真实IP X-Forwarded-For

    Tomcat 获取客户端真实IP X-Forwarded-For 代码实现&#xff1a; 在Host标签下面添加代码&#xff1a; <Valve className"org.apache.catalina.valves.RemoteIpValve" remoteIpHeader"x-forwarded-for" remoteIpProxiesHeader"x-forwarded-by&q…

    Linux命令学习—Iptables 防火墙(上)

    1.1、防火墙 1、防火墙的定义 所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上 构造的保护屏障.是一种获取安全性方法的形象说法&#xff0c;它是一种计算机硬件和软件的结合&#xff0c;使 Internet 与 Intranet 之间建立起…

    大功率Boost升压电路实例设计

    项目介绍及参数要求 指标参数光伏额定功率: 4000W光伏最大输入电压: 350V光伏最小输入电压: 150V母线电压(Boost电路输出电压): 600V电流纹波率

    野生动物保护视频AI智能监管方案,撑起智能保护伞,守护野生动物

    一、背景 在当今世界&#xff0c;野生动物保护已经成为全球性的重要议题。然而&#xff0c;由于野生动物生存环境的不断恶化以及非法狩猎等活动的盛行&#xff0c;保护野生动物变得尤为迫切。为了更有效地保护野生动物&#xff0c;利用视频智能监管技术成为一种可行的方案。 …

    Java springboot使用EasyExcel读Excel文件,映射不到属性值,对象属性值都是null

    如果你的类上有这个注解&#xff0c;去掉火或注释掉就可以了 Accessors(chain true)解决方法

    IO流高级流

    前言 缓冲区能够提升输入输出的效率 虽然FileReader和FileWriter中也有缓冲区 但是BufferedReader和BufferWriter有两个非常好用的方法. 缓冲流 字节缓冲流 import java.io.*;public class BufferedStreamDemo {public static void main(String[] args) throws IOExceptio…

    「JavaEE」线程

    &#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 线程 &#x1f349;线程&#x1f34c;多线程&#x1f34c;线程与进程的联系&区别&#x1f34c;多线程编程&#x1f34c;创建线程&a…

    02_对象树

    #include "mypushbutton.h" #include <QDebug>MyPushButton::MyPushButton(QWidget *parent): QPushButton(parent) {qDebug()<<"我的按钮类构造调用"; }MyPushButton::~MyPushButton() {qDebug()<<"我的按钮类析构调用"; }交…

    OpenXR面部跟踪接口与VIVE OpenXR扩展详细解析

    面部跟踪技术是虚拟现实&#xff08;VR&#xff09;领域中的一个重要发展方向&#xff0c;它允许VR系统捕捉和解析用户的面部表情&#xff0c;从而提供更加自然和互动的用户体验。HTC VIVE通过其VIVE.OpenXR.FacialTracking扩展&#xff0c;为开发者提供了高级的面部跟踪功能。…

    若依从0到1部署

    服务器安装 MySQL8 Ubuntu 在 20.04 版本中&#xff0c;源仓库中 MySQL 的默认版本已经更新到 8.0&#xff0c;因此可以直接使用 apt-get 安装。 设置 apt 国内代理 打开 https://developer.aliyun.com/mirror/ 阿里云镜像站&#xff0c;找到适合自己的系统&#xff1a; 找…

    轻松查询车辆信息的全能接口

    在当今社会&#xff0c;车辆已经成为人们出行的重要工具之一。当我们在二手车买卖、事故处理或者其他需要查询车辆详细信息的情况下&#xff0c;我们通常需要耗费大量时间和精力去收集相关的资料。幸好&#xff0c;有了车辆信息查询接口&#xff0c;我们可以通过输入车架号vin来…

    SSH协议的优缺点

    SSH&#xff08;Secure Shell&#xff09;是一种用于在计算机网络上进行安全远程访问和执行命令的协议。提供加密通信通道&#xff0c;防止敏感信息在传输过程中被窃听或篡改。SSH还支持文件传输和端口转发等功能&#xff0c;使其成为广泛使用的安全远程管理工具。 1. 安全远程…

    【设计模式】聊聊观察者设计模式原理及应用

    原理 观察者模式属于行为模式&#xff0c;行为模式主要解决类和对象之间交互问题。 含义&#xff1a;在对象之间定义一个一对多的依赖&#xff0c;当一个对象状态改变时&#xff0c;所有依赖的对象会自动通知。 被依赖的对象被观察者(Observable) &#xff0c;依赖的对象观察…