当前位置:   article > 正文

来1道并查集题目(森林c++)_在计算机的图论中,树是由n个节点组成,除了根节点,每个节点都有一个“父节点”。例

在计算机的图论中,树是由n个节点组成,除了根节点,每个节点都有一个“父节点”。例

在计算机的图论中,树是由编号1到N的N个节点组成,除了根节点,每个节点都有一个“父节点”。例如下面是一个5个节点的树。

image.png

其中,2 、5号节点的父节点是4号节点,3、4号节点的父节点是1号节点, 1号节点是根节点,没有父节点。

这棵树的输入格式可以为:

共若干行:每行2个整数a,b,若a和b在同一颗树,输出0。否则,a所在的树的根连接到b所在的根,合并为一颗树,输出合并后树的高度。上图的树输入数据可以为:

2 4

5 4

3 1

2 3

图论中,还有森林概念,森林由多棵树组成。

现在每次加一个关系(a,b)后,输出相应的结果。本样例输出2 2 2 3 

输入格式

  第1行:2个正整数N,和M,分别表示节点数,和边数,范围在[1,1000000]。

  第2到M+1行:每行2个整数a,b。

【提示】数据比较大,需要使用scanf,printf。

输出格式

  M个数,表示每次加一个边(a,b)后,如果a和b不在同一棵树输出合并后的树高,否则输出0。

输入/输出例子1

输入:

10 7

10 9

2 8

6 6

1 5

5 4

10 2

1 2

输出:

2 2 0 2 3 3 4

样例解释

 好吧,并查集树,上代码!

  1. /*
  2. ——————/′ ˉ/)
  3. —————--/—-/
  4. —————-/—-/
  5. ———--/′ˉ/'--'/′ˉ`•_
  6. ———-/'/--/—-/—--/¨ˉ\
  7. ——--('(———- ˉ~/'--')
  8. ———\————-'—--/
  9. ———-'\'————_-•′
  10. ————\———--(
  11. ————-\———-*/
  12. #include<bits/stdc++.h>
  13. using namespace std;
  14. struct qi{
  15. int ro,hi;
  16. }s[1000000];
  17. int find_root(int i){
  18. int r=i;
  19. while(s[r].ro!=r){
  20. r=s[r].ro;
  21. }
  22. while(i!=r){
  23. int t=i;
  24. i=s[i].ro;
  25. s[t].ro=r;
  26. }
  27. return s[i].ro;
  28. }
  29. void init(int n,int m){
  30. for(int i=1;i<=n;i++){
  31. s[i].ro=i;
  32. s[i].hi=1;
  33. }
  34. }
  35. int main(){
  36. int n,m;
  37. scanf("%d%d",&n,&m);
  38. init(n,m);
  39. for(int i=0;i<m;i++){
  40. int a,b;
  41. scanf("%d%d",&a,&b);
  42. int roa=find_root(a),rob=find_root(b);
  43. if(roa==rob) printf("0 ");
  44. else {
  45. s[rob].hi=max(s[rob].hi,s[roa].hi+1);
  46. printf("%d ",s[rob].hi);
  47. s[roa].ro=rob;
  48. }
  49. }
  50. return 0;
  51. }

稍微皮一下,嘻嘻。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/52880
推荐阅读
相关标签
  

闽ICP备14008679号