#include using namespace std; class Solution { public: int minMalwareSpread(vector>& graph, vector& initial) { int n=graph.size(); vector sz(n,1); //n号节点如果是祖先,他的孩子个数 vector v_num(n,0);//n号节点如果是祖先,他的孩子中initial的个数 for (int i: initial){ v_num[i]=1; } //并查集核心模板代码 //并查集祖先数组定义 vector pa(n); //并查集祖先数组初始化 for (int i=0;i query = [&](int i){ if (pa[i]!=i) pa[i]=query(pa[i]); return pa[i]; }; //并查集合并祖先函数 auto link = [&](int i,int j){ int li=query(i); int lj=query(j); if (li != lj){ pa[li]=lj; //其他附加操作 sz[lj]+=sz[li]; sz[li]=0; v_num[lj]+=v_num[li]; v_num[li]=0; } return; }; // //建立并查集,合并祖先 for (int i=0;imax_nodes){ res=i; max_nodes=sz[li]; }else if (sz[li]==max_nodes){ res=min(res,i); } have_one=true; } else { res_multi=min(res_multi,i); } } return have_one?res:res_multi; } }; int main() { Solution sol; vector> graph={{1,0,0},{0,1,0},{0,0,1}}; vector initial={0,2}; cout << sol.minMalwareSpread(graph,initial) << endl; return 0; }