924. Minimize Malware Spread

Văn bản bài toán được dịch từ tiếng Nga theo ngôn ngữ giao diện. Mã không thay đổi.

Вам дана сеть из n узлов, представленная в виде đồ thịа с матрицей смежности n x n, где i-й узел непосредственно связан с j-м узлом, если graph[i][j] == 1. Некоторые узлы изначально заражены вредоносным ПО. Если два узла соединены напрямую и хотя бы один из них заражен вредоносным ПО, то оба узла будут заражены вредоносным ПО. Такое распространение вредоносного ПО будет продолжаться до тех пор, пока не останется ни одного узла, который можно было бы заразить таким образом. Предположим, что M(initial) - это конечное number узлов, зараженных вредоносным ПО, во всей сети после прекращения распространения вредоносного ПО. Мы удалим из initial ровно один узел. return тот узел, удаление которого минимизирует M(initial). Если можно удалить несколько узлов, чтобы минимизировать M(initial), return такой узел с наименьшим индексом. Обратите внимание, что если узел был удален из начального списка зараженных узлов, он все равно может быть заражен позже из-за распространения вредоносного ПО.

Ví dụ:

Input: arr = [1,1,2,2,3,3,4,4,5,5], target = 8

Output: 20

C# lời giải

đã khớp/gốc
using System;
using System.Collections.Generic;
public class Solution {
    public int MinMalwareSpread(int[][] graph, int[] initial) {
        int n = graph.Length;
        HashSet<int> initialSet = new HashSet<int>(initial);
        Array.Sort(initial);
        int minInfected = int.MaxValue;
        int bestNode = initial[0];
        
        foreach (int node in initial) {
            HashSet<int> infected = new HashSet<int>(initialSet);
            infected.Remove(node);
            foreach (int i in initialSet) {
                if (i != node) {
                    Dfs(graph, i, infected);
                }
            }
            if (infected.Count < minInfected) {
                minInfected = infected.Count;
                bestNode = node;
            }
        }
        
        return bestNode;
    }
    
    private void Dfs(int[][] graph, int node, HashSet<int> infected) {
        for (int neighbor = 0; neighbor < graph.Length; neighbor++) {
            if (graph[node][neighbor] == 1 && !infected.Contains(neighbor)) {
                infected.Add(neighbor);
                Dfs(graph, neighbor, infected);
            }
        }
    }
}

C++ lời giải

bản nháp tự động, xem lại trước khi gửi
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int MinMalwareSpread(int[][] graph, vector<int>& initial) {
        int n = graph.size();
        HashSet<int> initialSet = new HashSet<int>(initial);
        sort(initial.begin(), initial.end());
        int minInfected = int.MaxValue;
        int bestNode = initial[0];
        
        foreach (int node in initial) {
            HashSet<int> infected = new HashSet<int>(initialSet);
            infected.Remove(node);
            foreach (int i in initialSet) {
                if (i != node) {
                    Dfs(graph, i, infected);
                }
            }
            if (infected.size() < minInfected) {
                minInfected = infected.size();
                bestNode = node;
            }
        }
        
        return bestNode;
    }
    
    private void Dfs(int[][] graph, int node, HashSet<int> infected) {
        for (int neighbor = 0; neighbor < graph.size(); neighbor++) {
            if (graph[node][neighbor] == 1 && !infected.Contains(neighbor)) {
                infected.push_back(neighbor);
                Dfs(graph, neighbor, infected);
            }
        }
    }
}

Java lời giải

đã khớp/gốc
import java.util.*;

class Solution {
    public int minMalwareSpread(int[][] graph, int[] initial) {
        int n = graph.length;
        Set<Integer> initialSet = new HashSet<>();
        for (int node : initial) {
            initialSet.add(node);
        }
        Arrays.sort(initial);
        int minInfected = Integer.MAX_VALUE;
        int bestNode = initial[0];
        
        for (int node : initial) {
            Set<Integer> infected = new HashSet<>(initialSet);
            infected.remove(node);
            for (int i : initialSet) {
                if (i != node) {
                    dfs(graph, i, infected);
                }
            }
            if (infected.size() < minInfected) {
                minInfected = infected.size();
                bestNode = node;
            }
        }
        
        return bestNode;
    }
    
    private void dfs(int[][] graph, int node, Set<Integer> infected) {
        for (int neighbor = 0; neighbor < graph.length; neighbor++) {
            if (graph[node][neighbor] == 1 && !infected.contains(neighbor)) {
                infected.add(neighbor);
                dfs(graph, neighbor, infected);
            }
        }
    }
}

JavaScript lời giải

đã khớp/gốc
var minMalwareSpread = function(graph, initial) {
    const dfs = (node, infected) => {
        for (let neighbor = 0; neighbor < graph.length; neighbor++) {
            if (graph[node][neighbor] === 1 && !infected.has(neighbor)) {
                infected.add(neighbor);
                dfs(neighbor, infected);
            }
        }
    };

    const n = graph.length;
    const initialSet = new Set(initial);
    initial.sort((a, b) => a - b);
    let minInfected = Infinity;
    let bestNode = initial[0];
    
    for (const node of initial) {
        const infected = new Set(initialSet);
        infected.delete(node);
        for (const i of initialSet) {
            if (i !== node) {
                dfs(i, infected);
            }
        }
        if (infected.size < minInfected) {
            minInfected = infected.size;
            bestNode = node;
        }
    }
    
    return bestNode;
};

Python lời giải

đã khớp/gốc
def minMalwareSpread(graph, initial):
    def dfs(node, infected):
        for neighbor in range(len(graph)):
            if graph[node][neighbor] == 1 and neighbor not in infected:
                infected.add(neighbor)
                dfs(neighbor, infected)

    n = len(graph)
    initial_set = set(initial)
    initial.sort()
    min_infected = float('inf')
    best_node = initial[0]
    
    for node in initial:
        infected = set(initial_set)
        infected.remove(node)
        for i in initial_set:
            if i != node:
                dfs(i, infected)
        if len(infected) < min_infected:
            min_infected = len(infected)
            best_node = node
    
    return best_node

Go lời giải

đã khớp/gốc
package main

func minMalwareSpread(graph [][]int, initial []int) int {
    dfs := func(node int, infected map[int]struct{}) {
        for neighbor := 0; neighbor < len(graph); neighbor++ {
            if graph[node][neighbor] == 1 {
                if _, ok := infected[neighbor]; !ok {
                    infected[neighbor] = struct{}{}
                    dfs(neighbor, infected)
                }
            }
        }
    }
    
    n := len(graph)
    initialSet := make(map[int]struct{})
    for _, v := range initial {
        initialSet[v] = struct{}{}
    }
    sort.Ints(initial)
    minInfected := int(^uint(0) >> 1)
    bestNode := initial[0]
    
    for _, node := range initial {
        infected := make(map[int]struct{})
        for k := range initialSet {
            if k != node {
                infected[k] = struct{}{}
            }
        }
        for i := range initialSet {
            if i != node {
                dfs(i, infected)
            }
        }
        if len(infected) < minInfected {
            minInfected = len(infected)
            bestNode = node
        }
    }
    
    return bestNode
}

Algorithm

1⃣Определить количество зараженных узлов после распространения вредоносного ПО для исходного списка initial.

2⃣Для каждого узла в initial удалить его и вычислить количество зараженных узлов после распространения вредоносного ПО.

3⃣find узел, удаление которого минимизирует количество зараженных узлов. Если есть несколько таких узлов, выбрать узел с наименьшим индексом.

😎

Vacancies for this task

việc làm đang hoạt động with overlapping task tags are đã hiển thị.

Tất cả việc làm
Chưa có việc làm đang hoạt động.