1. 程式人生 > 其它 >使用並查集計算朋友圈的個數

使用並查集計算朋友圈的個數

題目

假設一個班級中有n個學生。學生之間有些是朋友,有些不是。朋友關係是可以傳遞的。例如,假如AB是朋友,BC是朋友,則AC是間接朋友。定義朋友圈就是一組直接朋友或間接朋友的學生。輸入一個n x n的矩陣M表示班級的朋友關係,如果M[i][j] = 1,那麼學生ij是直接朋友。請計算該班級中朋友圈的數目。

解答

public class FriendCircle {
    public int findCircleNum(int[][] M){
        int[] fathers = new int[M.length];
        for (int i = 0; i < fathers.length; i++) {
            fathers[i] = i;
        }

        int count = M.length;
        for (int i = 0; i < M.length; i++) {
            for (int j = i + 1; j < M.length; j++) {
                if (M[i][j] == 1 && union(fathers, i, j)){
                    count--;
                }

            }

        }
        return count;
    }

    private int findFather(int[] fathers, int i){
        if (fathers[i] != i)
            fathers[i] = findFather(fathers, fathers[i]);
        return fathers[i];
    }

    private boolean union(int[] fathers, int i, int j) {
        int fatherOfI = findFather(fathers, i);
        int fatherOfJ = findFather(fathers, j);

        if (fatherOfI != fatherOfJ){
            fathers[fatherOfI] = fathers[fatherOfJ];
            return true;
        }
        return false;
    }

}