https://leetcode.com/problems/friend-circles/description/
比较基本的题型了,注意一点,就是groups --, 在union的时候就行。 最初写的时候还遍历了一次求一共几个集合,太慢
const int SZ = 205;
int p[SZ];
int pcnt[SZ];
int find_p(int x) {
return x == p[x] ? x : find_p(p[x]);
}
class Solution {
public:
int groups;
int findCircleNum(vector<vector<int>>& M) {
int n = M.size();
// int m = M[0].size();
groups = n;
for (int i = 0; i <= n; i++) p[i] = i, pcnt[i]=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j || !M[i][j]) continue;
link(i,j);
}
}
return groups;
}
void link(int x, int y) {
int pa = find_p(x);
int py = find_p(y);
if (py == pa) return;
p[py] = pa;
groups --;
// pcnt[pa] += pcnt[py];
}
};