文章

26

粉丝

407

获赞

0

访问

341.2k

头像
边带权并查集
经验总结
发布于2020年4月19日 22:19
阅读数 12.1k

银河英雄传说:

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int n;
  5. const int N = 31010;
  6. int father[N], d[N], size[N];
  7. int find(int x){
  8. if (father[x]!=x){
  9. int root = find(father[x]);
  10. d[x] += d[father[x]];
  11. father[x] = root;
  12. }
  13. return father[x];
  14. }
  15. void union_set(int x,int y){
  16. x = find(x); y = find(y);
  17. father[x] = y;
  18. d[x] = size[y];
  19. size[y] += size[x];
  20. }
  21. int main(){
  22. scanf("%d\n", &n);
  23. for (int i = 0; i <= 30000; i++){
  24. father[i] = i;
  25. size[i] = 1;
  26. d[i] = 0;
  27. }
  28. for (int i = 0; i < n; i++){
  29. char ch = getchar();
  30. int u, v;
  31. scanf("%d %d\n", &u, &v);
  32. if (ch == 'M'){
  33. union_set(u, v);
  34. }
  35. else{
  36. if (find(u) == find(v)){
  37. printf("%d\n", abs(d[u] - d[v]) - 1);
  38. }
  39. else{
  40. printf("-1\n");
  41. }
  42. }
  43. }
  44. return 0;
  45. }

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发