有n個同學,他們之間有些是朋友,有些不是。「友誼」是可以傳遞的,例如a和b是朋友,b和c是朋友,那麼a與c也是朋友;朋友圈就是完成「友誼」傳遞後的一組朋友。給定n*n的矩陣代表同學間是否是朋友,如果m[i][j]=1代表第i個學生與第j個學生是朋友,否則不是。求朋友圈的個數。
例如:input:
[[1,1,0],
[1,1,0],
[0,0,1]]
output:2
input:
[[1,1,0],
[1,1,1],
[0,1,1]]
output:1
#include
class
disjointset
_count = n;}~
disjointset()
intfind
(int p)
return p;
}void
union_
(int p,
int q)
if(_size[i]
< _size[j]
)else
_count--;}
private
: std::vector<
int> _id;
std::vector<
int> _size;};
class
solution
~solution()
intfindcirclenum
(std::vectorint>>
& m)}}
return disjoint_set._count;}}
;int
main()
,,};
std::vectorint>>m(
3, std::vector<
int>(3
,0))
;for
(int i =
0; i <
3; i++)}
solution solve;
printf
("%d\n"
, solve.
findcirclenum
(m))
;return0;
}
執行結果:
2
並查集(求朋友圈的個數)
有如下題目 已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈,請寫程式求出這n個人裡一共有多少個朋友圈。假如 n 5 m 3 r 表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1 2 3屬於乙個朋友圈,4 5屬於另乙個朋友...
PAT 朋友圈(並查集)
某學校有n個學生,形成m個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成乙個朋友圈。乙個學生可以同時屬於若干個不同的俱樂部。根據 我的朋友的朋友也是我的朋友 這個推論可以得出,如果a和b是朋友,且b和c是朋友,則a和c也是朋友。請編寫程式計算最大朋友圈中有多少人。輸入的第一行包含兩個正整數n...
5 9 朋友圈 (並查集)
某學校有n個學生,形成m個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成乙個朋友圈。乙個學生可以同時屬於若干個不同的俱樂部。根據 我的朋友的朋友也是我的朋友 這個推論可以得出,如果a和b是朋友,且b和c是朋友,則a和c也是朋友。請編寫程式計算最大朋友圈中有多少人。輸入的第一行包含兩個正整數n...