使用並查集計算朋友圈的個數
阿新 • • 發佈:2022-04-06
題目
假設一個班級中有
n
個學生。學生之間有些是朋友,有些不是。朋友關係是可以傳遞的。例如,假如A
和B
是朋友,B
和C
是朋友,則A
和C
是間接朋友。定義朋友圈就是一組直接朋友或間接朋友的學生。輸入一個n x n
的矩陣M
表示班級的朋友關係,如果M[i][j] = 1
,那麼學生i
和j
是直接朋友。請計算該班級中朋友圈的數目。
解答
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; } }