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 }

 

posted @ 2020-05-28 20:20  hongfua  阅读(213)  评论(0编辑  收藏  举报