import java.util.*;
public class Main {
private static int n; //人数
private static int m; //语言数
private static int k; //已知的信息数
private static int[] parent; //并查集
private static int[] peopleToLanguage;
private static Map> peopleToLanguageMap = new HashMap<>(); //根据人将语言分群
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
k = scanner.nextInt();
peopleToLanguage = new int[n];
Arrays.fill(peopleToLanguage, -1);
parent = new int[m];
for (int i = 0; i
parent[i] = i; //每一种语言单独一个集合
}
boolean[] show = new boolean[m];
for (int i = 0; i
int people = scanner.nextInt();
int language = scanner.nextInt() - 1;
peopleToLanguage[people - 1] = language;
if (peopleToLanguageMap.containsKey(people - 1)) {
peopleToLanguageMap.get(people - 1).add(language);
} else {
List list = new ArrayList<>();
list.add(language);
peopleToLanguageMap.put(people - 1, list);
}
show[language] = true;
}
int result = 0;
for (int i = 0; i
if (peopleToLanguage[i] == -1) { //不会任何语言的人,肯定需要学习一种语言
result++;
}
}
for (List list : peopleToLanguageMap.values()) {
for (int i = 0; i
unionTwo(list.get(i), list.get(i + 1));
}
}
Set parentSet = new HashSet<>();
for (int i = 0; i
if (show[i]) {
parentSet.add(findParent(i));
}
}
if (parentSet.size() != 0) {
result += parentSet.size() - 1;
}
System.out.print(result);
}
private static int findParent(int x) {
int a = x;
while (x != parent[x]) {
x = parent[x];
}
while (a != parent[x]) {
int z = a;
a = parent[a];
parent[z] = x;
}
return x;
}
private static void unionTwo(int a, int b) {
int aParent = findParent(a), bParent = findParent(b);
if (aParent != bParent) {
parent[aParent] = bParent;
}
}
}