1. 程式人生 > >leetcode 924. 儘量減少惡意軟體的傳播

leetcode 924. 儘量減少惡意軟體的傳播

題意:

在一些分散的圖中,某些圖中有某些節點是病原體,與這些節點在一個圖中的所有節點都被感染了,現在求去掉一個原始病原體,使得最終所有圖中感染的節點最少

思路:

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;
}
};