合肥知名网站制作公司,免费开网店,赵县网站建设,郑州一建官网1、题目描述
班上有 N 名学生。其中有些人是朋友#xff0c;有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友#xff0c;B 是 C 的朋友#xff0c;那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈#xff0c;是指所有朋友的集合。
给定一个 N * N 的矩阵 M…1、题目描述
班上有 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。
2、解法
2.1 并查集
并查集https://www.cnblogs.com/noKing/p/8018609.html
class Solution {class UnionFind {public int arr[] new int[200];UnionFind() {for(int i0;iarr.length;i) {arr[i] i;}}public int find(int element) {while(element ! arr[element]) {element arr[element];}return element;}public void union(int firstElement, int secondElement) {int firstParent find(firstElement);int secondParent find(secondElement);if(firstParent ! secondParent) {arr[firstParent] secondParent;}}}/*** 普通并查集解法* param arr* return*/public int findCircleNum(int[][] arr) {if(arrnull || arr.length 1 || arr[0].length1) {return 0;}UnionFind unionFind new UnionFind();for(int i0;iarr.length;i) {for(int ji1;jarr.length;j) {//并查集if(arr[i][j]1) {unionFind.union(i, j);}}}int res 0;for(int i0;iarr.length;i) {if(i unionFind.arr[i]) {res;}}return res;}
}