题目描述:
有 n
个城市,其中一些彼此相连,另一些没有相连。如果城市 a
与城市 b
直接相连,且城市 b
与城市 c
直接相连,那么城市 a
与城市 c
间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n
的矩阵 isConnected
,其中 isConnected[i][j] = 1
表示第 i
个城市和第 j
个城市直接相连,而 isConnected[i][j] = 0
表示二者不直接相连。
返回矩阵中 省份 的数量。
示例 1:
输入: edges = [[1,2], [1,3], [2,3]] 输出: [2,3]
示例 2:
输入: edges = [[1,2], [2,3], [3,4], [1,4], [1,5]] 输出: [1,4]
提示:
n == edges.length
3 <= n <= 1000
edges[i].length == 2
1 <= ai < bi <= edges.length
ai != bi
edges
中无重复元素- 给定的图是连通的
思路:
典型的并查集算法,无脑套用即可。
代码:
class Solution {
public static int MAXN=1001;
public static int[] father=new int[MAXN];
public int findCircleNum(int[][] isConnected) {
build(isConnected.length);
for(int i=0;i<isConnected.length;i++){
for(int j=0;j<=i;j++){
if(isConnected[i][j]==1){
union(i,j);
}
}
}
int count=0;
int pre=-1;
Set<Integer> set=new HashSet<>();
for(int i=0;i<isConnected.length;i++){
set.add(find(i));
}
return set.size();
}
public static void build(int n){
for(int i=0;i<=n;i++){
father[i]=i;
}
}
public static int find(int i){
if(i!=father[i]){
father[i]=find(father[i]);
}
return father[i];
}
public static void union(int x,int y){
father[find(x)]=find(y);
}
}