3
int minMalwareSpread(vector<vector<int>> &graph, vector<int> &initial) {4
sort(initial.begin(), initial.end());5
int ans = -1, mn = INT_MAX, n = graph.size();7
vector<vector<int>> new_graph(n);8
for (int i = 0; i < n; i++)9
for (int j = 0; j < n; j++)10
if (graph[i][j]) new_graph[i].push_back(j);12
for (auto &k : initial) {13
vector<int> dsu(n, -1);14
for (int i = 0; i < n; i++)15
for (auto &j : new_graph[i])16
if (i != k && j != k) {17
int a = findParent(dsu, i), b = findParent(dsu, j);18
if (a != b) dsu[b] += dsu[a], dsu[a] = b;21
vector<int> infected(n, 0);22
for (auto &i : initial)23
if (i != k) infected[findParent(dsu, i)]++;25
int total_infected = 0;26
for (int i = 0; i < n; i++)27
if (infected[i]) total_infected += abs(dsu[i]);29
if (total_infected < mn) mn = total_infected, ans = k;32
return ans == -1 ? initial[0] : ans;35
int findParent(vector<int> &dsu, int i) {37
while (dsu[i] >= 0) i = dsu[i];39
if (i != a) dsu[a] = i;