上传文件至 /
This commit is contained in:
parent
093d0e9812
commit
6558066118
|
@ -0,0 +1,76 @@
|
|||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
class Solution {
|
||||
public:
|
||||
int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {
|
||||
int n=graph.size();
|
||||
vector<int> sz(n,1); //n号节点如果是祖先,他的孩子个数
|
||||
vector<int> v_num(n,0);//n号节点如果是祖先,他的孩子中initial的个数
|
||||
for (int i: initial){
|
||||
v_num[i]=1;
|
||||
}
|
||||
//并查集核心模板代码
|
||||
//并查集祖先数组定义
|
||||
vector<int> pa(n);
|
||||
//并查集祖先数组初始化
|
||||
for (int i=0;i<n;i++) {
|
||||
pa[i]=i;
|
||||
}
|
||||
//并查集查找祖先函数
|
||||
function<int (int)> 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;i<n;i++){
|
||||
for (int j=0;j<n;j++){
|
||||
if (graph[i][j]==1)
|
||||
link(i,j);
|
||||
}
|
||||
}
|
||||
int res=n;
|
||||
int res_multi=n;
|
||||
int max_nodes=0;
|
||||
bool have_one=false;
|
||||
for (int i:initial){
|
||||
int li=query(i);
|
||||
if (v_num[li]==1){
|
||||
if (sz[li]>max_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<vector<int>> graph={{1,0,0},{0,1,0},{0,0,1}};
|
||||
vector<int> initial={0,2};
|
||||
cout << sol.minMalwareSpread(graph,initial) << endl;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue