1
var minMalwareSpread = function (graph, initial) {3
let AdjList = new Map();4
let listFromGraph = (mat) => {5
// convert adj matrix to adj list6
for (let i = 0; i < n; i++) {8
for (let j = 0; j < n; j++) {9
if (mat[i][j] === 1 && i !== j) {16
let visitedSet = new Set(); //visited set, to manage the visited nodes & their count as they are unique17
let dfs = (curr, node) => {18
// dfs helper, visit the graph assuming that node, given as 2nd parameter is deleted22
if (visitedSet.has(curr)) {25
visitedSet.add(curr); // size of visited shows how many nodes are visited/affected by the malware26
let neighbours = AdjList[curr];27
for (let i in neighbours) {28
// visit all the neighbours29
dfs(neighbours[i], node);32
let MinSpread = n; // min index of node with max reduction in malware33
let SpreadDist = n; // number of nodes affected by malware if MinSpread was deleted34
for (let i = 0; i < initial.length; i++) {35
for (let j = 0; j < initial.length; j++) {36
// find the total nodes affected if ith node is removed37
dfs(initial[j], initial[i]);39
if (SpreadDist == visitedSet.size) {40
// to get min index but same impact41
MinSpread = Math.min(initial[i], MinSpread);43
if (SpreadDist > visitedSet.size) {45
MinSpread = initial[i];46
SpreadDist = visitedSet.size;48
visitedSet.clear(); // clear visited set for next index to be deleted