初学python记录:力扣924. 尽量减少恶意软件的传播

题目:

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

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

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

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

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

提示:

  • 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 中所有整数均不重复

思考:

由题意“只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染”可知,将图中所有彼此有路径到达的节点们看成一组,如果一组中有至少一个节点初始时被感染,那么这一组所有节点最后都会被感染。

我们要使得最后被感染的总节点数最少,就要找到这样一个组:

  • 组内只有一个节点最初被感染 
  • 组内节点数尽可能多

如果这样的组只有一个,直接返回其最初感染的节点索引;如果这样的组有多个(节点数同样最多),在他们各自的最初感染的节点中选择索引最小的那个返回;如果不存在这样的组,则返回initial中索引最小的点。(*)

那么我们的算法步骤如下:

1. 遍历initial中的每个节点node。

2. 对每个node,计算它所在的组包含的节点数量,步骤见下文。如果node所在的组之前已经计算过,则不需要重复计算。用字典记录组:键——node;值——[组的节点数量,组内属于initial的节点数量]。用数组visited记录每个节点是否被访问过。

3. 在这些组中依据上文中(*)段的内容返回相应的值。

第2步中具体的计算步骤如下:

1. 用队列queue记录待判断的节点,初始为{node},组内节点数nodes_count初始为1,组内属于initial的节点数nodes_initial初始为1。

2. 每次从队列queue中弹出一个节点x,将x的visited置为已访问。遍历其余所有节点k:如果节点k还未访问过,且与节点x相邻,则将节点k加入队列queue,组内节点数nodes_count加一,如果节点k属于initial,则nodes_initial加一。

3. 直到queue为空为止,返回node所在组的组内节点数nodes_count,组内属于initial的节点数nodes_initial。

代码如下:

from collections import deque

class Solution(object):
    def minMalwareSpread(self, graph, initial):
        """
        :type graph: List[List[int]]
        :type initial: List[int]
        :rtype: int
        """
        # 将互相能到达的节点们视为一个组,(如果initial中有属于这一组的节点)每组的节点数量即为这一个小网络的感染恶意软件的最终节点数

        n = len(graph)
        sum_dict = {}     # 字典sum_dict记录每组的索引最小的节点(键),节点数量(值1)和属于initial的节点数量(值2)
        visited = [-1] * n     # 数组visited记录节点是否访问过(已计算出相连节点数)

        def connectedNodes(graph, initial, node):    # 函数统计组内节点数
            queue = deque()    # 队列储存待判断相邻节点的节点
            queue.append(node)
            nodes_count = 1
            nodes_initial = 1
            while queue:
                x = queue.popleft()
                visited[x] = 1
                for k in range(n):
                    if k == x:    # 跳过当前节点本身
                        continue
                    if visited[k] != 1 and graph[x][k] == 1 and k not in queue:
                    # 将当前节点的相邻且未访问过的节点加入队列,组内节点数加一
                        nodes_count += 1
                        queue.append(k)
                        if k in initial:
                            nodes_initial += 1
            return nodes_count, nodes_initial


        for i in initial:
            if visited[i] == -1:
                nodes_count, nodes_initial = connectedNodes(graph, initial, i)
                sum_dict[i] = [nodes_count, nodes_initial]
        
        count = 0
        res = min(initial)
        for node, value in sum_dict.items():
        # 在字典中找到某一组满足条件:属于initial的节点只有一个(值2)且节点数(值1)最多
        # 如果存在这样的组,返回这一字典项的键;如果不存在这样的组,则返回0
            if value[1] == 1:
                if count < value[0]:
                    res = node
                    count = value[0]
        return res 

提交通过,自己做出来困难题真开心嘿嘿:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BK9535可替代BK9531 BEKEN博通 无线高品质语音发射传输芯片 提供开发资料

概 述 BK9531已经停产&#xff0c;厂家推出升级替代芯片BK9535 BK9535芯片是用于无线高品质语音发射传输的芯片&#xff0c;芯片覆盖频段范围为&#xff1a;V段&#xff08;160~270MHz&#xff09;、U段&#xff08;450~980MHz&#xff09;、1G频段&#xff08;980~1176MHz&a…

一款可自动跳广告的安卓App开源项目

开放权限有风险&#xff0c;使用App需谨慎&#xff01; gkd 基于 无障碍 高级选择器 订阅规则 的自定义屏幕点击 APP 功能 基于 高级选择器 订阅规则 快照审查, 它可以实现 点击跳过任意开屏广告/点击关闭应用内部任意弹窗广告, 如关闭百度贴吧帖子广告卡片/知乎回答底…

HarmonyOS开发案例:【智能煤气检测】

样例简介 智能煤气检测系统通过实时监测环境中烟雾浓度&#xff0c;当一氧化碳浓度超标时&#xff0c;及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程配置智能煤气检测系统的报警阈值&#xff0c;远程接收智能煤气检测系统报警信息。…

华为再次布局新行业:合作伙伴已超前谋划,该领域将大有可为

华为布局新行业 华为向外界公布了一个重要信息&#xff1a;在过去的三年里&#xff0c;尽管受到美国的制裁&#xff0c;华为仍然成功地完成了超过13000个元器件的国产替代研发&#xff0c;以及4000多块电路板的迭代开发。 不仅在硬件领域取得了显著成就&#xff0c;在软件和生…

AutoMQ 登顶 Hacker News: 开源项目流量的第一桶金以及经验分享

01 事件回顾 2024 年 4 月 8 日中午&#xff0c;随着 AutoMQ 的一则简短的标题内容&#xff1a;Show HN: AutoMQ - A Cost-Effective Kafka Distro That Can Autoscale in Seconds[1] 成功登顶 Hacker News &#xff08;HN&#xff09; &#xff0c;我们迎来了大量优质、精准的…

为什么一开始不被看好的单片机,现在概括了所有数据产品行业?

这主要归因于技术和认知的局限。 在其发展初期&#xff0c;单片机的性能、存储容量以及开发工具都颇为有限&#xff0c;难以契合复杂应用的种种需求。彼时&#xff0c;许多人确实难以洞察到它的未来走向。 然而&#xff0c;时过境迁&#xff0c;人们逐步领悟到了单片机在各个…

密码学 | 椭圆曲线数字签名方法 ECDSA(下)

目录 10 ECDSA 算法 11 创建签名 12 验证签名 13 ECDSA 的安全性 14 随机 k 值的重要性 15 结语 ⚠️ 原文&#xff1a;Understanding How ECDSA Protects Your Data. ⚠️ 写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留着学习。同时&#xff0c;经过几…

部署Zabbix代理服务器

目录 1.准备环境 2.设置 zabbix 的下载源 3.安装 zabbix 所需的数据库 3.1添加数据库用户&#xff0c;以及 zabbix 所需的数据库信息 3.2导入数据库信息 4.修改 zabbix-proxy 配置文件 5.启动 zabbix-proxy 6.在所有主机上配置 hosts 解析 7.在 Web 页面配置 agent 代…

市面上加密混淆软件的比较和推荐

引言 市面上有许多加密混淆软件可供开发者使用&#xff0c;但哪些软件是最好用的&#xff1f;哪些软件受到开发者的喜爱&#xff1f;本文将根据一次在CSDN上的投票结果&#xff0c;为大家介绍几款在程序员中普及度较高的加密软件。以下是投票结果&#xff0c;希望能对大家的选择…

什么是组网?如何远程组网?

在当今数字化时代&#xff0c;组网已成为企业提高工作效率、节省时间和成本的关键技术。组网是将多台计算机或其他网络设备连接起来&#xff0c;形成一个互联互通的网络系统。本文将概述组网的主要目的、实现方式及其价值&#xff0c;并深入分析远程组网策略。 1. 组网目的与价…

BK9531 BK9532上海博通BEKEN 提供开发资料

.概述 BK9531/BK9532 芯片是用于无线高品质语音传输的芯片组&#xff0c;包括发射芯片BK9531 和接收芯片 BK9532&#xff0c;每个芯片覆盖频段范围为&#xff1a;V 段160~270MHz 和 U 段500~980MHz。 BK9531/BK9532 采用数字调制和高性能音频 ADC 和 DAC&#xff0c;配合极低延…

idea2023专业版安装破解+maven配置教程

前言 上一篇文章已经介绍了maven在Win10系统的安装配置教程。基于Win10的maven配置环境&#xff0c;本篇文章将介绍idea2023的安装破解教程及maven在idea2023的配置教程&#xff08;同时会将maven在idea2023的配置教程内容补充至上一篇文章&#xff09;。 一、idea2023下载安…

再也不想用丑东西了!一个高颜值的备忘录,分享给你们【文末领源码】

谁工作中不得有点丢三落四的&#xff0c;但是被老大点名批评确实有点过不去了&#xff0c;提醒小伙伴们把必要的事情挂出来&#xff0c;同事说虽然已经有一款系统&#xff0c;但展示的不好看&#xff0c;根本不想用&#xff0c;于是找到了一款颜值还不错的备忘录工具 -- memo …

工作的第五天了

1.今天内容 1.现在的基本都增删改查都有 2.下一步做规格商品添加规格的方式 3.商品规格比较特殊 4.我们添加一个商品。通用一个商品&#xff0c;然后下面添加规格信息 5.如何做 6.第一个是添加商品 7.商品对应多个属性方式&#xff0c;简单来说是一个一对多的方式&#x…

WPF Extended.Wpf.Toolkit 加载界面

1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…

基于ssm酒吧存酒系统论文

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套酒吧存酒系统有管理员和用户两…

Adobe联手OpenAI,AI视频编辑新功能震撼上线!

Adobe 尝试与 OpenAI 合作以添加AI工具 前言 就在北京时间4月15日 &#xff0c; Adobe准备开辟制作软件的新道路&#xff0c;该公司正处于允许第三方生成式人工智能工具&#xff08;如OpenAI的Sora等&#xff09;进入其广泛使用的视频编辑软件的早期阶段。那么这次Adobe与OpenA…

MathJax —— Vue3的使用方法

版本&#xff1a; mathjax3 需要实现效果 一、使用方式 1. index.html 中引入 <!-- 识别单行&#xff0c;行内&#xff0c;\( \)样式的公式 --><script>MathJax {tex: {inlineMath: [[$, $],[$$, $$], [\\(, \\)]]},};</script><script id"MathJ…

国外新闻媒体稿件宣发:海外pr发稿干货秘籍-大舍传媒

一、了解目标市场和受众 发布新闻稿件的首要步骤是了解你的目标市场和受众。在撰写新闻稿件之前&#xff0c;你需要研究你的目标市场&#xff0c;了解他们的需求、兴趣和习惯。你还需要了解你的受众&#xff0c;包括他们的年龄、性别、职业、地理位置和媒体使用习惯等。这些信…

Shell——执行方式详解

一.什么是shell Shell 是一个计算机程序&#xff0c;它提供了用户与操作系统内核之间的交互界面。它接受来自用户或其他程序的命令&#xff0c;并将其转换为操作系统能理解的形式&#xff0c;然后执行这些命令并将结果返回给用户或程序。 Shell 在操作系统中扮演着重要的角色…