https://leetcode.com/problems/friend-circles/
朋友關係是雙向的,因此矩陣M是關於對角線對稱的,只需要處理對角線以上的半邊即可。
用一維數組 f [ ] 記錄每個節點真實的根,使用並查集的方式,求出朋友圈的個數。
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int row = M.size();
if(row == 0) return 0;
int col = M[0].size();
if(col == 0) return 0;
int c = 0;
int i, j;
for(i=0;i<300;i++)//將每個節點的根初始化爲它自己
f[i]=i;
for(i=0;i<row;i++){
for(j=i+1;j<col;j++){
if(M[i][j]==1){//如果兩個點之間存在一條邊,則將這兩個點進行合併
u(i, j);
}
}
}
for(i=0;i<row;i++)//如果一個點的根節點就是它自己,則這個點代表了一個朋友圈
if(i==f[i])
c+=1;
return c;
}
int f[300];
void u(int a, int b){ //並
int x = find(a);
int y = find(b);
if(x!=y)
f[x]=y;
}
int find(int x){ //查
while(f[x]!=x)
x = f[x];
return x;
}
};