题目链接
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static int f[];
public static int find(int x){return x == f[x] ? x : (f[x] = find(f[x]));}//路径压缩 + 查询祖先
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
f = new int[n + m + 2];
char a[][] = new char[n + 2][m + 2];
for(int i = 0;i < n;i++)
{
String s = cin.next();
for(int j = 0;j < m;j++)
a[i][j] = s.charAt(j);
}
for(int i = 0;i < n;i++)f[i] = i;
for(int i = 0;i < m;i++)f[i + n] = i + n;
int vis[] = new int[n + 2];
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
if(a[i][j] == '1'){
int x = find(i);
int y = find(j + n);
if(x != y)f[x] = y;
}
int cnt = 0;
Set<Integer> s = new HashSet<>();
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
if(a[i][j] == '1'){
s.add(find(i));//这里一定要注意再次寻找祖先,因为之前并未更新孩子的最终祖先。//
}
System.out.println(s.size());
}
}