diff --git a/bcj.cpp b/bcj.cpp new file mode 100644 index 0000000..e589c3b --- /dev/null +++ b/bcj.cpp @@ -0,0 +1,76 @@ +#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; +}