leetcode 547. Friend Circles
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int n = M.size(), res = 0;
vector<int> father(n, 0);
for(int i = 0; i < n; i++)
father[i] = i;
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++){
if(M[i][j] ==1){
int fai = findfather(father, i);
int faj = findfather(father, j);
if(fai != faj)
father[fai] = faj;
}
}
}
for(int i = 0; i < n; i++){
if(father[i] == i)
res++;
}
return res;
}
int findfather(vector<int>& father, int x){
while(father[x] != x){
x = father[x];
}
return x;
}
};
leetcode 928 尽量减少恶意软件的传播 II
class Solution{
private:
int father[305];
int node_counter[305];
int source_counter[305];
int find(int p)
{
if(p==father[p])
return p;
else
{
father[p]=find(father[p]);
return father[p];
}
}
void make_union(int p,int q)
{
int x,y;
x=find(p);
y=find(q);
if(x!=y)
father[x]=y;
}
public:
int minMalwareSpread(vector<vector<int>>& graph,vector<int>& initial)
{
int minus_node=0,n=graph.size();
sort(initial.begin(),initial.end());
int result=initial[0];
for(int i=0;i<n;++i)
{
father[i]=i;
node_counter[i]=0;
source_counter[i]=0;
}
for(int i=0;i<n;++i)
{
for(int j=0;j<i;++j)
{
if(graph[i][j])
make_union(i,j);
}
}
for(int i=0;i<n;++i)
node_counter[find(father[i])]+=1;
for(int i=0;i<initial.size();++i)
source_counter[find(father[initial[i]])]+=1;
for(int i=0;i<initial.size();++i)
{
if(source_counter[find(father[initial[i]])]==1 && node_counter[find(father[initial[i]])]>minus_node)
{
minus_node=node_counter[find(father[initial[i]])];
result=initial[i];
}
}
return result;
}
};
leetcode323 Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
class Solution {
public:
int countComponents(int n, vector<pair<int, int> >& edges) {
int res = n;
vector<int> root(n);
for (int i = 0; i < n; ++i) root[i] = i;
for (auto a : edges) {
int x = find(root, a.first), y = find(root, a.second);
if (x != y) {
--res;
root[y] = x;
}
}
return res;
}
int find(vector<int> &root, int i) {
while (root[i] != i) i = root[i];
return i;
}
};