返回介绍

solution / 0900-0999 / 0924.Minimize Malware Spread / README

发布于 2024-06-17 01:03:33 字数 6370 浏览 0 评论 0 收藏 0

924. 尽量减少恶意软件的传播

English Version

题目描述

给出了一个由 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 中所有整数均不重复

    解法

    方法一

    class Solution:
      def minMalwareSpread(self, graph: List[List[int]], initial: List[int]) -> int:
        n = len(graph)
        p = list(range(n))
        size = [1] * n
    
        def find(x):
          if p[x] != x:
            p[x] = find(p[x])
          return p[x]
    
        for i in range(n):
          for j in range(i + 1, n):
            if graph[i][j] == 1:
              pa, pb = find(i), find(j)
              if pa == pb:
                continue
              p[pa] = pb
              size[pb] += size[pa]
    
        mi = inf
        res = initial[0]
        initial.sort()
        for i in range(len(initial)):
          t = 0
          s = set()
          for j in range(len(initial)):
            if i == j:
              continue
            if find(initial[j]) in s:
              continue
            s.add(find(initial[j]))
            t += size[find(initial[j])]
          if mi > t:
            mi = t
            res = initial[i]
        return res
    
    class Solution {
      private int[] p;
    
      public int minMalwareSpread(int[][] graph, int[] initial) {
        int n = graph.length;
        p = new int[n];
        for (int i = 0; i < n; ++i) {
          p[i] = i;
        }
        int[] size = new int[n];
        Arrays.fill(size, 1);
        for (int i = 0; i < n; ++i) {
          for (int j = i + 1; j < n; ++j) {
            if (graph[i][j] == 1) {
              int pa = find(i), pb = find(j);
              if (pa == pb) {
                continue;
              }
              p[pa] = pb;
              size[pb] += size[pa];
            }
          }
        }
        int mi = Integer.MAX_VALUE;
        int res = initial[0];
        Arrays.sort(initial);
        for (int i = 0; i < initial.length; ++i) {
          int t = 0;
          Set<Integer> s = new HashSet<>();
          for (int j = 0; j < initial.length; ++j) {
            if (i == j) {
              continue;
            }
            if (s.contains(find(initial[j]))) {
              continue;
            }
            s.add(find(initial[j]));
            t += size[find(initial[j])];
          }
          if (mi > t) {
            mi = t;
            res = initial[i];
          }
        }
        return res;
      }
    
      private int find(int x) {
        if (p[x] != x) {
          p[x] = find(p[x]);
        }
        return p[x];
      }
    }
    
    class Solution {
    public:
      vector<int> p;
    
      int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {
        int n = graph.size();
        p.resize(n);
        for (int i = 0; i < n; ++i) p[i] = i;
        vector<int> size(n, 1);
        for (int i = 0; i < n; ++i) {
          for (int j = i + 1; j < n; ++j) {
            if (graph[i][j]) {
              int pa = find(i), pb = find(j);
              if (pa == pb) continue;
              p[pa] = pb;
              size[pb] += size[pa];
            }
          }
        }
        int mi = 400;
        int res = initial[0];
        sort(initial.begin(), initial.end());
        for (int i = 0; i < initial.size(); ++i) {
          int t = 0;
          unordered_set<int> s;
          for (int j = 0; j < initial.size(); ++j) {
            if (i == j) continue;
            if (s.count(find(initial[j]))) continue;
            s.insert(find(initial[j]));
            t += size[find(initial[j])];
          }
          if (mi > t) {
            mi = t;
            res = initial[i];
          }
        }
        return res;
      }
    
      int find(int x) {
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
      }
    };
    
    var p []int
    
    func minMalwareSpread(graph [][]int, initial []int) int {
      n := len(graph)
      p = make([]int, n)
      size := make([]int, n)
      for i := 0; i < n; i++ {
        p[i] = i
        size[i] = 1
      }
      for i := 0; i < n; i++ {
        for j := i + 1; j < n; j++ {
          if graph[i][j] == 1 {
            pa, pb := find(i), find(j)
            if pa == pb {
              continue
            }
            p[pa] = pb
            size[pb] += size[pa]
          }
        }
      }
      mi := 400
      res := initial[0]
      sort.Ints(initial)
      for i := 0; i < len(initial); i++ {
        t := 0
        s := make(map[int]bool)
        for j := 0; j < len(initial); j++ {
          if i == j {
            continue
          }
          if s[find(initial[j])] {
            continue
          }
          s[find(initial[j])] = true
          t += size[find(initial[j])]
        }
        if mi > t {
          mi = t
          res = initial[i]
        }
      }
      return res
    }
    
    func find(x int) int {
      if p[x] != x {
        p[x] = find(p[x])
      }
      return p[x]
    }
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文