这周完全不知道要不要写博客,老师说这周好像不用写,但为了保险起见,还是写了吧。。。。
这道题是两周前做的那道题的升级版。区别在于从初始列表中移除节点的方法是从图中完全移除。下面给出题目地址:
这道题一看就是用dfs和bfs做的。我上次用了dfs,这次就用bfs做。其实就是渲染每个污染点所在的连通分支,然后观察每个节点被几个污染点污染。对于一个污染点,我们需要找出只被这个污染点污染的个数。然后我们要找出这些数中的最大值。需要注意的是,bfs的过程中,如果遇到另一个污染点,那么就不能将它加入队列中。
下面贴出代码:
class Solution {
public:
int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {
int i, j, temp, maxnum, res = 100000;
vector<int> cnt(graph.size());
vector<int> vis2(graph.size());
vector<int> ans(graph.size());
for(i=0;i<initial.size();i++)
{
vis2[initial[i]]=1;
res = min(res, initial[i]);
}
for(i=0;i<initial.size();i++)
{
queue<int> bfs;
vector<int> vis = vis2;
bfs.push(initial[i]);
while(!bfs.empty())
{
temp = bfs.front();
bfs.pop();
vis[temp] = 1;
for(j=0;j<graph[temp].size();j++)
{
if(!vis[j]&&graph[temp][j])
{
bfs.push(j);
if(cnt[j]==0)
cnt[j]=initial[i]+1;
else
cnt[j]=-1;
}
}
}
}
for(i=0;i<cnt.size();i++)
{
if(cnt[i]>0)
{
temp = cnt[i]-1;
ans[temp]++;
if(ans[temp]>ans[res])
res = temp;
if(ans[temp]==ans[res]&&temp<res)
res = temp;
}
}
return res;
}
};
这个实现真的慢,但是最近比较忙,就没有优化。实际上,我看到网上的解法有用并查集的,等我寒假试一下。。。运行结果就不贴了,太慢了。。。