mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 08:27:30 +08:00
76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
package leetcode
|
|
|
|
import (
|
|
"math"
|
|
|
|
"github.com/halfrost/LeetCode-Go/template"
|
|
)
|
|
|
|
func minMalwareSpread2(graph [][]int, initial []int) int {
|
|
if len(initial) == 0 {
|
|
return 0
|
|
}
|
|
uf, minIndex, count, countMap, malwareMap, infectMap := template.UnionFind{}, initial[0], math.MinInt64, map[int]int{}, map[int]int{}, map[int]map[int]int{}
|
|
for _, v := range initial {
|
|
malwareMap[v]++
|
|
}
|
|
uf.Init(len(graph))
|
|
for i := range graph {
|
|
for j := range graph[i] {
|
|
if i == j {
|
|
break
|
|
}
|
|
if graph[i][j] == 1 && malwareMap[i] == 0 && malwareMap[j] == 0 {
|
|
uf.Union(i, j)
|
|
}
|
|
}
|
|
}
|
|
for i := 0; i < len(graph); i++ {
|
|
countMap[uf.Find(i)]++
|
|
}
|
|
// 记录每个集合和直接相邻病毒节点的个数
|
|
for _, i := range initial {
|
|
for j := 0; j < len(graph); j++ {
|
|
if malwareMap[j] == 0 && graph[i][j] == 1 {
|
|
p := uf.Find(j)
|
|
if _, ok := infectMap[p]; ok {
|
|
infectMap[p][i] = i
|
|
} else {
|
|
tmp := map[int]int{}
|
|
tmp[i] = i
|
|
infectMap[p] = tmp
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// 选出病毒节点中序号最小的
|
|
for _, v := range initial {
|
|
minIndex = min(minIndex, v)
|
|
}
|
|
for i, v := range infectMap {
|
|
// 找出只和一个病毒节点相连通的
|
|
if len(v) == 1 {
|
|
tmp := countMap[uf.Find(i)]
|
|
keys := []int{}
|
|
for k := range v {
|
|
keys = append(keys, k)
|
|
}
|
|
if count == tmp && minIndex > keys[0] {
|
|
minIndex = keys[0]
|
|
}
|
|
if count < tmp {
|
|
minIndex = keys[0]
|
|
count = tmp
|
|
}
|
|
}
|
|
}
|
|
return minIndex
|
|
}
|
|
|
|
func min(a int, b int) int {
|
|
if a > b {
|
|
return b
|
|
}
|
|
return a
|
|
}
|