-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathminimizeMalwareSpread.cpp
More file actions
52 lines (47 loc) · 1.53 KB
/
minimizeMalwareSpread.cpp
File metadata and controls
52 lines (47 loc) · 1.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Source: https://leetcode.com/problems/minimize-malware-spread/
// Author: Miao Zhang
// Date: 2021-03-25
class Solution {
public:
int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {
int n = graph.size();
vector<int> colors(n, -1);
int color = 0;
for (int node = 0; node < n; node++) {
if (colors[node] == -1) {
dfs(graph, colors, node, color++);
}
}
vector<int> cntcolor(color);
for (int c: colors) {
cntcolor[c]++;
}
vector<int> inicolor(color);
for (int node: initial) {
inicolor[colors[node]]++;
}
int res = INT_MAX;
for (int node: initial) {
int c = colors[node];
if (inicolor[c] == 1) {
if (res == INT_MAX) {
res = node;
} else if (cntcolor[c] > cntcolor[colors[res]]) {
res = node;
} else if (cntcolor[c] == cntcolor[colors[res]] && node < res) {
res = node;
}
}
}
return res == INT_MAX ? *min_element(initial.begin(), initial.end()) : res;
}
private:
void dfs(vector<vector<int>>& graph, vector<int>& colors, int node, int color) {
colors[node] = color;
for (int i = 0; i < graph.size(); i++) {
if (graph[node][i] == 1 && colors[i] == -1) {
dfs(graph, colors, i, color);
}
}
}
};