这个题目,就是并查集,然后再去遍历一遍,看看有几个源头,就知道分为几部分。其实可以用连通做,就是如果两个是一个源头的话,就一直往下走,直到走不到,因为要的是连通数,题目给输入样例,所以直接这样做就可以了。
import java.*;
import java.util.Scanner;
public class Main {
static int[] father = null;
public static void main(String[] args){
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
int k = cin.nextInt();
father = new int[m*n+10];
for(int i = 0;i <= m*n;i++)
father[i] = i;
for(int i = 0;i < k;i++)
{
int a = cin.nextInt();
int b = cin.nextInt();
join(a,b);
}
int cnt = 0;
for(int i = 1;i <= m*n;i++){
if(father[i] == i){
cnt++;
}
}
System.out.println(cnt);
}
public static void join(int a,int b) {
if(f_ind(a) != f_ind(b)){
father[f_ind(a)] = f_ind(b);
}
}
public static int f_ind(int a){
if(father[a] == a){
return a;
}
else{
return father[a] = f_ind(father[a]);
}
}
}