Skip to content

Commit d462c72

Browse files
committed
✨924.尽量减少恶意软件的传播
1 parent d4551bc commit d462c72

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,5 @@
200200
- [297.二叉树的序列化与反序列化](leetcode/hard/297.go)
201201
- [793.阶乘函数后 K 个零](leetcode/hard/793.go)
202202
- [828.统计子串中的唯一字符](leetcode/hard/828.go)
203+
- [924.尽量减少恶意软件的传播](leetcode/hard/t924/solution.go)
203204
- [1994.好子集的数目](leetcode/hard/1994.go)

leetcode/hard/t924/solution.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package t924
2+
3+
// 924. 尽量减少恶意软件的传播
4+
// https://leetcode.cn/problems/minimize-malware-spread/
5+
// minMalwareSpread 计算最小恶意软件传播范围
6+
// graph:表示网络连接的二维数组,graph[i][j]为1表示节点i和节点j之间有连接,为0表示没有连接;
7+
// initial:表示初始感染的节点数组;
8+
// 返回值:返回移除一个节点后,最小的恶意软件传播范围的节点编号。
9+
func minMalwareSpread(graph [][]int, initial []int) int {
10+
n := len(graph) // 节点数量
11+
ids := make([]int, n) // 用于标记节点所属的连通分量
12+
idToSize := make(map[int]int) // 记录每个连通分量的大小
13+
id := 0 // 连通分量的唯一标识
14+
// 通过DFS遍历图,将节点划分为连通分量,并记录每个连通分量的大小
15+
for i := range ids {
16+
if ids[i] == 0 {
17+
id++
18+
ids[i] = id
19+
size := 1
20+
q := []int{i}
21+
for len(q) > 0 {
22+
u := q[0]
23+
q = q[1:]
24+
for v := range graph[u] {
25+
if ids[v] == 0 && graph[u][v] == 1 {
26+
size++
27+
q = append(q, v)
28+
ids[v] = id
29+
}
30+
}
31+
}
32+
idToSize[id] = size
33+
}
34+
}
35+
idToInitials := make(map[int]int) // 记录初始感染的连通分量数量
36+
for _, u := range initial {
37+
idToInitials[ids[u]]++
38+
}
39+
ans := n + 1 // 初始化答案为一个不可能达到的值
40+
ansRemoved := 0 // 初始化移除的节点数量为0
41+
// 遍历初始感染的节点,计算并更新最小恶意软件传播范围的节点
42+
for _, u := range initial {
43+
removed := 0
44+
if idToInitials[ids[u]] == 1 {
45+
removed = idToSize[ids[u]] // 如果连通分量中只有一个初始感染节点,则移除该节点后,整个连通分量都被移除
46+
}
47+
if removed > ansRemoved || (removed == ansRemoved && u < ans) {
48+
ans, ansRemoved = u, removed
49+
}
50+
}
51+
return ans // 返回最小恶意软件传播范围的节点编号
52+
}

leetcode/hard/t924/solution_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package t924
2+
3+
import "testing"
4+
5+
func TestMinMalwareSpread(t *testing.T) {
6+
tests := []struct {
7+
name string
8+
graph [][]int
9+
initial []int
10+
want int
11+
}{
12+
{"Case 1", [][]int{{1, 1, 0}, {1, 1, 0}, {0, 0, 1}}, []int{0, 1}, 0},
13+
{"Case 2", [][]int{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}, []int{0, 2}, 0},
14+
{"Case 3", [][]int{{1, 1, 1}, {1, 1, 1}, {1, 1, 1}}, []int{1, 2}, 1},
15+
}
16+
for _, tt := range tests {
17+
t.Run(tt.name, func(t *testing.T) {
18+
if got := minMalwareSpread(tt.graph, tt.initial); got != tt.want {
19+
t.Errorf("minMalwareSpread() = %v, want %v", got, tt.want)
20+
}
21+
})
22+
}
23+
}

0 commit comments

Comments
 (0)