生活随笔
收集整理的這篇文章主要介紹了
并查集 模板
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
知識點:
并查集是一種樹型的數據結構,用于處理一些不相交集合的合并問題。
并查集的主要操作有
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);?? ????????}?? ????????if(MAX!=-1)?? ????????????printf("%d/n",MAX);????? ????????else?? ????????????printf("1/n");????? ????}?? ????return?0;?? }??
總結
以上是生活随笔為你收集整理的并查集 模板的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。