坑点:
- 不是删除一个顶点,是将一个顶点去除颜色
了解上面的坑点之后就简单多了
只有当且仅当一个 initial 点在连通分量中,我们擦除它的颜色才有收益
import java.util.*;
class Solution {
public int minMalwareSpread(int[][] graph, int[] initial) {
Arrays.sort(initial);
int n = graph.length;
int[] comp = new int[n];
int[] candidate = new int[n+1];
boolean[] isVal = new boolean[n];
for(int i=0 ; i<initial.length ; ++i)isVal[initial[i]] = true;
int C = 0;
for(int i=0 ; i<graph.length ; ++i){
Queue<Integer> Q = new LinkedList<>();
if(comp[i]==0)dfs(i, ++C, comp, graph,Q,isVal);
if(Q.size() == 1){
candidate[C] = Q.remove()+1;
}
}
int[] cnt = new int[C+1];
for(int i=0 ; i<n ; ++i)cnt[comp[i]]++;
int val = 0,ans = 0;
for(int i=1 ; i <=C ; ++i)
if(candidate[i]!=0){
if(cnt[i] > val|| (cnt[i] == val && ans > candidate[i])){
ans = candidate[i];
val = cnt[i];
}
}
if(ans !=0)return ans -1;
else return initial[0];
}
private void dfs(int u, int col,int[] comp,int[][] g, Collection<Integer> black,boolean[] isVal) {
comp[u] = col;
if(isVal[u])black.add(u);
for(int i=0 ; i< comp.length ; ++i)
if(g[u][i]==1 &&comp[i]==0)dfs(i, col, comp,g,black,isVal);
}
}