1.这里说的删除节点,是把这个节点从感染节点变为不受感染的节点。其原先的连接关系不变。
2.题中要找的点 就是找它所处的联通分量只有它一个感染点,然后在这个集合中找一个其所处的联通分量包含节点最多,且该感染点本身序号最小。
3.方法 DFS遍历图即可。
class Solution {
public:
int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {
int n=graph.size();
vector<int> colors(n,-1);
int c=0;
for(int i:initial){
if(colors[i]==-1) dfs(graph,colors,i,c++);
}
vector<int> size(c,0),colorcount(c,0);
for(int color:colors){
if(color>-1) size[color]++;
}
for(int x:initial){
colorcount[colors[x]]++;
}
int ans=INT_MAX;
for(int x:initial){
int c=colors[x];
if(colorcount[c]==1){
if(ans==INT_MAX){
ans=x;
}else if(size[c]>size[colors[ans]]){
ans=x;
}else if(size[c]==size[colors[ans]]&&x<ans){
ans=x;
}
}
}
if(ans==INT_MAX){
for(int x:initial){
ans=min(ans,x);
}
}
return ans;
}
void dfs(vector<vector<int>>& graph,vector<int>& colors,int x,int color){
colors[x]=color;
for(int i=0;i<graph[x].size();i++){
if(graph[x][i]==1&&colors[i]==-1){
dfs(graph,colors,i,color);
}
}
}
};