1、题目
https://leetcode-cn.com/problems/friend-circles/
2、题意
题解1:dfs
当前这个同学不在一个朋友圈内的话,将这一行与他为朋友的和与他朋友的朋友标记为一个朋友圈;res++;
返回res即可。
class Solution {
public:
vector<bool> st;
int findCircleNum(vector<vector<int>>& M) {
int m = M.size(),res = 0;;
if(m==0) return 0;
st = vector<bool>(m,false);
for(int i=0;i<m;i++)
{
if(!st[i])
{
dfs(i,M);
res++;
}
}
return res;
}
void dfs(int k,vector<vector<int>>& M)
{
st[k] = true;
for(int i=0;i<M.size();i++)
{
if(!st[i]&&M[k][i]==1)
{
dfs(i,M);
}
}
}
};
题解2:并查集
当前这个人有朋友则将他们合并为一个集合;结果就是集合的个数;
class Solution {
public:
vector<int> p;
int res = 0;
int find(int x)
{
return x==p[x]?x:p[x] = find(p[x]);
}
int findCircleNum(vector<vector<int>>& M) {
int m = M.size();
p = vector<int>(m,0);
for(int i=0;i<m;i++)
p[i] = i;
for(int i=0;i<m;i++)
for(int j=i+1;j<m;j++)
{
if(M[i][j]==1)
{
int fa = find(i),fb = find(j);
if(fa!=fb)
p[fa] = fb;
}
}
for(int i=0;i<m;i++)
if(i==find(i))
res++;
return res;
}
};