算法作业第十四周(leetcode)——928. Minimize Malware Spread II

这周完全不知道要不要写博客,老师说这周好像不用写,但为了保险起见,还是写了吧。。。。

这道题是两周前做的那道题的升级版。区别在于从初始列表中移除节点的方法是从图中完全移除。下面给出题目地址:

https://leetcode.com/problems/minimize-malware-spread-ii/

这道题一看就是用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;
    }
};

这个实现真的慢,但是最近比较忙,就没有优化。实际上,我看到网上的解法有用并查集的,等我寒假试一下。。。运行结果就不贴了,太慢了。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值