题目描述

思路
类似我们统计每个并查集集合的思路,计算我们的每个点距离根节点的距离的时候。我们只需要在需要加的集合,每个集合里面都加上被加上集合的size。我们只需要给被加上集合的根节点加上size就好了,在每次查询距离根节点的距离的时候,我们更新查询节点的d数组就好了。


代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import java.io.*; import java.util.*;
class Main{ public static int N = 500010; public static int[] find = new int[N],size = new int[N],d = new int[N]; public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); public static int find(int x){ if(find[x] != x){ int parent = find[x]; find[x] = find(find[x]); d[x] += d[parent]; } return find[x]; } public static void main(String[] args)throws Exception{ int n = Integer.parseInt(br.readLine()); for(int i = 1;i < N;i++) find[i] = i; Arrays.fill(size,1); for(int i = 1;i <= n;i++){ String[] s = br.readLine().split(" "); String o = s[0]; int a = Integer.parseInt(s[1]), b = Integer.parseInt(s[2]); int pa = find(a),pb = find(b); if(o.equals("M")){ if(pa != pb){ d[pa] += size[pb]; size[pb] += size[pa]; find[pa] = pb; } }else{ if(pa != pb){ bw.write("-1\n"); continue; } if(a == b) bw.write(String.valueOf(0+"\n")); else bw.write(String.valueOf(Math.abs(d[a] - d[b]) - 1)+"\n"); } } bw.flush(); } }
|