LC每日一题|20240417 - 928. 尽量减少恶意软件的传播 II
给定一个由
n个节点组成的网络,用n x n个邻接矩阵graph表示。在节点网络中,只有当graph[i][j] = 1时,节点i能够直接连接到另一个节点j。一些节点
initial最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。假设
M(initial)是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。我们可以从
initial中删除一个节点,并完全移除该节点以及从该节点到任何其他节点的任何连接。请返回移除后能够使
M(initial)最小化的节点。如果有多个节点满足条件,返回索引 最小的节点 。
提示:
n == graph.lengthn == graph[i].length2 <= n <= 300graph[i][j]是0或1.graph[i][j] == graph[j][i]graph[i][i] == 11 <= initial.length < n0 <= initial[i] <= n - 1-
initial中每个整数都不同
题目等级:Hard
解题思路
还有什么可说的?垃圾题!
AC代码
class Solution {
fun minMalwareSpread(graph: Array<IntArray>, initial: IntArray): Int {
val map = Array<ArrayList<Int>>(graph.size) { arrayListOf() }
for (i in graph.indices) for (j in graph[i].indices) {
if (i != j && graph[i][j] == 1) map[i].add(j)
}
initial.sort()
val c = IntArray(initial.size)
for (i in c.indices) {
val queue = ArrayDeque<Int>()
val visited = BooleanArray(graph.size)
var count = 0
for (j in initial.indices) if (i != j) {
count ++
visited[initial[j]] = true
queue.addLast(initial[j])
}
while (queue.isNotEmpty()) {
repeat(queue.size) {
val node = queue.removeFirst()
map[node].forEach {
if (it != initial[i] && !visited[it]) {
count++
visited[it] = true
queue.addLast(it)
}
}
}
}
c[i] = count
}
return initial[c.indexOf(c.min()!!)]
}
}