合根植物
原题链接:问题 1873: [蓝桥杯][2017年第八届真题]合根植物
解题思路:查询连通分支,使用并查集,参考讲解
import java.util.Scanner;
public class Main {
static int[] f;//根集合
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int k = sc.nextInt();
f=new int[n*m+1];
for (int i = 0; i <= n * m; i++) {//初始化根集合
f[i] = i;
}
for (int i = 0; i < k; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
join(a, b);//将ab连通
}
int cnt=0;
for (int i = 1; i <f.length ; i++) {
if(f[i]==i){
cnt++;//计数连通分支数
}
}
System.out.println(cnt);
sc.close();
}
private static void join(int a, int b) {
//找到a的根和b的根,若不同则使其相同,则两个分支连通
int fa = find(a), fb = find(b);
if (fa != fb) {
f[fa] = fb;
}
}
//带路径压缩的并查集
private static int find(int x) {
return x==f[x]?x:find(f[x]);
}
}