AcWing837连通块中点的数量
题目:
题目大意:
如图所示。
数据范围:
如图所示
思路:
正常使用并查集的同时,多维护一个连通块的数量。
代码:
import java.util.Scanner;
public class Main {
public static int[] cnt = new int[100010], p = new int[100010];
public static int find(int x){
if (x != p[x])
p[x] = find(p[x]);
return p[x];
}
public static void union(int a, int b){
cnt[find(b)] += cnt[find(a)];
p[find(a)] = find(b);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(), m = scanner.nextInt();
for (int i = 1; i <= n; i ++ ){
p[i] = i;
cnt[i] = 1;
}
while (m -- > 0){
String c = scanner.next();
int a = scanner.nextInt();
if (c.equals("C")){
int b = scanner.nextInt();
if (find(a) != find(b))
union(a, b);
}else if (c.equals("Q1")){
int b = scanner.nextInt();
if (find(a) == find(b)){
System.out.println("Yes");
}else{
System.out.println("No");
}
}else if (c.equals("Q2")){
System.out.println(cnt[find(a)]);
}
}
}
}
时空复杂度分析等:
-
时间复杂度 : O(1)
-
空间复杂度 : O(n)