日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并查集 模板

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

知識點

并查集是一種樹型的數據結構,用于處理一些不相交集合的合并問題。
并查集的主要操作有
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;??
  • }??
  • 總結

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

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