题意:
在一些分散的图中,某些图中有某些节点是病原体,与这些节点在一个图中的所有节点都被感染了,现在求去掉一个原始病原体,使得最终所有图中感染的节点最少
思路:
bfs,然后找只有一个病原体的联通快的最大数量,因为只有单个病原体的联通块去掉这个病原体之后会减少被感染的节点数量。如果有多个病原体在一个联通块,那么即使去掉一个病原体,这个联通块最终也会被感染。此外,如果有多个病原体节点都满足条件,返回最小的那个。是最小,不是索引最小。
代码:
class Solution {
public:
int flag[400]; //记录是否为病原体
int f[400];//记录是否已经访问过
int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {
memset(flag,0,sizeof(flag));
memset(f,0,sizeof(f));
int sz = initial.size();
for(int i=0;i<sz;i++){
flag[initial[i]] = 1;
}
int ma = 0,num = 0,cu = 0,all=0;
sz = graph.size();
for(int i=0;i<sz;i++){
queue<int>q;
if(!f[i]&&flag[i])q.push(i);
num = 0;all = 0;
while(!q.empty()) //每一次遍历都找一个联通块中的病原体数量,总数量,以及病原体的最小节点编号
{
int aa = q.front();q.pop();
if(flag[aa]==1)num++;all++;
f[aa] = 1;
for(int j=0;j<sz;j++){
if(graph[aa][j]==1){
if(!f[j])q.push(j);
}
}
}
sort(initial.begin(),initial.end());
if(num==1){
if(all>ma){
ma = all;
cu = i;
}
if(all==ma){
cu = min(cu,i);
}
}
}
if(ma==0)return initial[0];
else return cu;
}
};