Time: $O(n^2)$, where $n = |\texttt{graph}|$ Space: $O(n)$
classUnionFind{public:UnionFind(intn):id(n){iota(begin(id),end(id),0);}voidunion_(intu,intv){id[find(u)]=find(v);}intfind(intu){returnid[u]==u?u:id[u]=find(id[u]);}private:vector<int>id;};classSolution{public:intminMalwareSpread(vector<vector<int>>&graph,vector<int>&initial){constintn=graph.size();UnionFinduf(n);vector<int>ufSize(n);vector<int>malwareCount(n);for(inti=0;i<n;++i)for(intj=i+1;j<n;++j)if(graph[i][j]==1)uf.union_(i,j);for(inti=0;i<n;++i)++ufSize[uf.find(i)];for(constinti:initial)++malwareCount[uf.find(i)];sort(begin(initial),end(initial));intans=initial[0];intmaxUfSize=0;// Find the max union's malware if it only contains 1 malwarefor(constinti:initial){constintid=uf.find(i);if(ufSize[id]>maxUfSize&&malwareCount[id]==1){maxUfSize=ufSize[id];ans=i;}}returnans;}};
classUnionFind{publicUnionFind(intn){id=newint[n];for(inti=0;i<n;++i)id[i]=i;}publicvoidunion(intu,intv){id[find(u)]=find(v);}publicintfind(intu){returnid[u]==u?u:(id[u]=find(id[u]));}privateint[]id;}classSolution{publicintminMalwareSpread(int[][]graph,int[]initial){finalintn=graph.length;UnionFinduf=newUnionFind(n);int[]ufSize=newint[n];int[]malwareCount=newint[n];for(inti=0;i<n;++i)for(intj=i+1;j<n;++j)if(graph[i][j]==1)uf.union(i,j);for(inti=0;i<n;++i)++ufSize[uf.find(i)];for(finalinti:initial)++malwareCount[uf.find(i)];Arrays.sort(initial);intans=initial[0];intmaxUfSize=0;// Find the max union's malware if it only contains 1 malwarefor(finalinti:initial){finalintid=uf.find(i);if(ufSize[id]>maxUfSize&&malwareCount[id]==1){maxUfSize=ufSize[id];ans=i;}}returnans;}}