日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

并查集 模板

發布時間:2025/6/15 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并查集 模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知識點

并查集是一種樹型的數據結構,用于處理一些不相交集合的合并問題。
并查集的主要操作有
1-合并兩個不相交集合
2-判斷兩個元素是否屬于同一個集合
3-路徑壓縮

?

我轉載的一個并查集介紹:(很詳細)http://blog.csdn.net/xiaotaoqibao/archive/2009/08/14/4447995.aspx

?

?

[c-sharp]?view plaincopy
  • #include?<iostream>??
  • using?namespace?std;??
  • #define?N?100005??
  • ??
  • struct?set??
  • {??
  • ????int?parent;??//記錄父節點??
  • ????int?rank;????//記錄集合的節點數??
  • }elem[N];??
  • ??
  • int?MAX;??
  • ??
  • void?init()??
  • {??
  • ????int?i;??
  • ????for(i=0;i<=N;i++)??
  • ????{??
  • ????????elem[i].parent=i;??
  • ????????elem[i].rank=1;??
  • ????}??
  • }??
  • ??
  • int?Find(int?x)??
  • {??
  • ????int?root,temp;??
  • ????temp=x;??
  • ????while(x!=elem[x].parent)????//尋找根節點??
  • ????????x=elem[x].parent;??
  • ????root=x;??
  • ????x=temp;??
  • ????while?(x!=elem[x].parent)???//壓縮路徑,全部賦值為根節點的值??
  • ????{??
  • ????????temp=elem[x].parent;??
  • ????????elem[x].parent=root;??
  • ????????x=temp;??
  • ????}??
  • ????return?root;??
  • }??
  • ??
  • void?Union(int?a,int?b)???//合并兩個集合??
  • {??
  • ????int?x,y;??
  • ????x=Find(a);??
  • ????y=Find(b);??
  • ????if(elem[x].rank>=elem[y].rank)??
  • ????{??
  • ????????elem[y].parent=elem[x].parent;??
  • ????????elem[x].rank+=elem[y].rank;??
  • ????????if(MAX<elem[x].rank)??
  • ????????????MAX=elem[x].rank;??
  • ????}??
  • ????else??
  • ????{??
  • ????????elem[x].parent=elem[y].parent;??
  • ????????elem[y].rank+=elem[x].rank;??
  • ????????if(MAX<elem[y].rank)??
  • ????????????MAX=elem[y].rank;??
  • ????}??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?n;??//有關系的對數??
  • ????int?a,b,x,y;??
  • ????while?(scanf("%d",&n)!=EOF)??
  • ????{??
  • ????????init();??
  • ????????MAX=-1;??
  • ????????while?(n--)??
  • ????????{??
  • ????????????scanf("%d%d",&a,&b);??
  • ????????????x=Find(a);??
  • ????????????y=Find(b);??
  • ????????????if(x!=y)??????
  • ????????????????Union(a,b);//a和b不是一個集合的,合并這兩個集合??
  • ????????}??
  • ????????if(MAX!=-1)??
  • ????????????printf("%d/n",MAX);???//輸出最大集合的節點數??
  • ????????else??
  • ????????????printf("1/n");???//此時n=0,證明都是沒關系的人??
  • ????}??
  • ????return?0;??
  • }??
  • 總結

    以上是生活随笔為你收集整理的并查集 模板的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。