547. 朋友圈
简单并查集。
班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
示例 1:
输入:
[[1,1,0],
[1,1,0],
[0,0,1]]
输出: 2
说明:已知学生0和学生1互为朋友,他们在一个朋友圈。
第2个学生自己在一个朋友圈。所以返回2。
示例 2:
输入:
[[1,1,0],
[1,1,1],
[0,1,1]]
输出: 1
说明:已知学生0和学生1互为朋友,学生1和学生2互为朋友,所以学生0和学生2也是朋友,所以他们三个在一个朋友圈,返回1。
注意:
N 在[1,200]的范围内。
对于所有学生,有M[i][i] = 1。
如果有M[i][j] = 1,则有M[j][i] = 1。
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 class Solution 7 { 8 public: 9 Solution() 10 { 11 int i; 12 for( i = 0; i < MAXSIZE; i++ ) 13 father[ i ] = i; 14 } 15 16 int findCircleNum( vector< vector< int > >& M ) 17 { 18 unsigned int i, j; 19 for( i = 0; i < M.size(); i++ ) 20 for( j = i; j < M.size(); j++ ) 21 if( M[ i ][ j ] == 1 ) 22 Union( i, j ); 23 24 int count = 0; 25 for( i = 0; i < M.size(); i++ ) 26 if( father[ i ] == i ) 27 ++count; 28 return count; 29 } 30 31 private: 32 33 int Find( int a ) 34 { 35 int fa = father[ a ]; 36 if( fa == a ) 37 return fa; 38 return father[ a ] = Find( fa ); 39 } 40 41 void Union( int a, int b ) 42 { 43 int fa = Find( a ); 44 int fb = Find( b ); 45 if( fa < fb ) 46 father[ fb ] = fa; 47 else 48 father[ fa ] = fb; 49 } 50 51 private: 52 enum { MAXSIZE = 201 }; 53 unsigned int father[ MAXSIZE ]; 54 }; 55 56 int main( int argc, char* argv[] ) 57 { 58 vector< vector< int > > stus = { 59 { 1, 1, 0 }, 60 { 1, 1, 1 }, 61 { 0, 1, 1 } 62 }; 63 64 Solution s; 65 cout << s.findCircleNum( stus ) << endl; 66 return 0; 67 }