LeetCode 547 Friend Circles(并查集)

There are N students in a class. Some of them are friends, while some are not. Their friendship is transitive in nature. For example, if A is a direct friend of B, and B is a direct friend of C, then A is an indirect friend of C. And we defined a friend circle is a group of students who are direct or indirect friends.

Given a N*N matrix M representing the friend relationship between students in the class. If M[i][j] = 1, then the ith and jth students are directfriends with each other, otherwise not. And you have to output the total number of friend circles among all the students.

Example 1:

Output: 2
Explanation:The 0th and 1st students are direct friends, so they are in a friend circle. 
The 2
nd student himself is in a friend circle. So return 2.

Example 2:

Output: 1
Explanation:The 0th and 1st students are direct friends, the 1st and 2nd students are direct friends, 
so the 0
th and 2nd students are indirect friends. All of them are in the same friend circle, so return 1.


  1. N is in range [1,200].
  2. M[i][i] = 1 for all students.
  3. If M[i][j] = 1, then M[j][i] = 1.




struct DisjointSet{
    int par;
    int rank;
#define maxn 222
struct DisjointSet ds[maxn];

void init()
    for(int i = 0;i < maxn;i++){
        ds[i].par = i;
        ds[i].rank = 1;

int find(int x)
    if(x == ds[x].par) return  x;
    return ds[x].par = find(ds[x].par);

void _union(int x, int y)
    x = find(x);
    y = find(y);
    if(x == y) return ;
    if(ds[x].rank < ds[y].rank)
        ds[x].par = y;
        if(ds[x].rank == ds[y].rank)
        ds[y].par = x;

int same(int x, int y)
    return find(x) == find(y);

int findCircleNum(int** M, int MRowSize, int MColSize) {
    for(int i = 0;i < MRowSize;i++){
        for(int j = i + 1;j < MColSize;j++){
            if(M[i][j] && M[j][i]) _union(i,j);
    int count = 0;
    for(int i = 0;i < MRowSize;i++){
        if(ds[i].par == i) count++;
    return count;

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页