Golang | LeetCode
3.95K subscribers
175 photos
1.06K links
Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.iss.one/+MVqzqT6ZzFFhYjhi
Вопросы собесов t.iss.one/+ajHN0OKU1okyZDky
Вакансии t.iss.one/+mX_RBWjiMTExODUy
Download Telegram
#hard
Задача: 928. Minimize Malware Spread II

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

Пример:
Input: graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]
Output: 0


👨‍💻 Алгоритм:

1⃣Определить компоненты связности в графе. Для каждой компоненты связности определить количество зараженных узлов и общее количество узлов.

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

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

😎 Решение:
package main

import (
"fmt"
"math"
"sort"
)

func minMalwareSpread(graph [][]int, initial []int) int {
n := len(graph)

dfs := func(node int, visited map[int]bool, component *[]int) {
stack := []int{node}
for len(stack) > 0 {
u := stack[len(stack)-1]
stack = stack[:len(stack)-1]
*component = append(*component, u)
for v := 0; v < n; v++ {
if graph[u][v] == 1 && !visited[v] {
visited[v] = true
stack = append(stack, v)
}
}
}
}

var components [][]int
visited := make(map[int]bool)

for i := 0; i < n; i++ {
if !visited[i] {
component := []int{}
visited[i] = true
dfs(i, visited, &component)
components = append(components, component)
}
}

infectedInComponent := make([]int, len(components))
nodeToComponent := make(map[int]int)

for idx, component := range components {
for _, node := range component {
nodeToComponent[node] = idx
}
}

for _, node := range initial {
componentIdx := nodeToComponent[node]
infectedInComponent[componentIdx]++
}

minInfected := math.MaxInt32
resultNode := initial[0]

sort.Ints(initial)

for _, node := range initial {
componentIdx := nodeToComponent[node]
if infectedInComponent[componentIdx] == 1 {
componentSize := len(components[componentIdx])
if componentSize < minInfected || (componentSize == minInfected && node < resultNode) {
minInfected = componentSize
resultNode = node
}
}
}

return resultNode
}

func main() {
graph := [][]int{
{1, 1, 0},
{1, 1, 0},
{0, 0, 1},
}
initial := []int{0, 1}
fmt.Println(minMalwareSpread(graph, initial))
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM