mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-06 09:23:19 +08:00
53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
package leetcode
|
|
|
|
import (
|
|
"math"
|
|
|
|
"github.com/halfrost/LeetCode-Go/template"
|
|
)
|
|
|
|
func minMalwareSpread(graph [][]int, initial []int) int {
|
|
if len(initial) == 0 {
|
|
return 0
|
|
}
|
|
uf, maxLen, maxIdx, uniqInitials, compMap := template.UnionFindCount{}, math.MinInt32, -1, map[int]int{}, map[int][]int{}
|
|
uf.Init(len(graph))
|
|
for i := range graph {
|
|
for j := i + 1; j < len(graph); j++ {
|
|
if graph[i][j] == 1 {
|
|
uf.Union(i, j)
|
|
}
|
|
}
|
|
}
|
|
for _, i := range initial {
|
|
compMap[uf.Find(i)] = append(compMap[uf.Find(i)], i)
|
|
}
|
|
for _, v := range compMap {
|
|
if len(v) == 1 {
|
|
uniqInitials[v[0]] = v[0]
|
|
}
|
|
}
|
|
if len(uniqInitials) == 0 {
|
|
smallestIdx := initial[0]
|
|
for _, i := range initial {
|
|
if i < smallestIdx {
|
|
smallestIdx = i
|
|
}
|
|
}
|
|
return smallestIdx
|
|
}
|
|
for _, i := range initial {
|
|
if _, ok := uniqInitials[i]; ok {
|
|
size := uf.Count()[uf.Find(i)]
|
|
if maxLen < size {
|
|
maxLen, maxIdx = size, i
|
|
} else if maxLen == size {
|
|
if i < maxIdx {
|
|
maxIdx = i
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return maxIdx
|
|
}
|