看大佬的形象解釋:
//並查集
按我現在對這個的理解:
就是給你一堆數,然後給你兩個兩個數的關係,然後關係的傳遞性(連帶性),這些數就都有了關係
有關係的數組成乙個陣列,然後輸出這個一維陣列,裡面有幾個沒關係的陣列
應該怎麼做呢?
第一種解釋是:
每給兩個數就把乙個數當成祖宗,把另乙個數當成孩子,然後給了孩子和另外乙個人有關係之後,這個孩子的祖宗就成了這個人的祖宗,
之後就是祖宗一樣的放在一起,然後有幾個祖宗不一樣的,就有幾個不同的集合
#includeconst int maxn = 10000;
int f[maxn];
/迴圈方法求祖宗
int getfather(int v)
return v;
}//遞迴方法求祖宗
int getfather2(int v)
}//遞迴,判斷求祖宗
int getfather3(int v)
//讓有關係的合併
void unions(int x,int y)
int main()
for(int i=1;i<=m;i++)
int sum=0;
for(int i=1;i<=n;i++) f[i] = getfather(f[i]);//收縮一下,讓關係直接指向祖宗
for(int i=1;i<=n;i++)
printf("%d",sum);//輸出有幾個不一樣的集合
return 0;
}
如果你上面的看不懂,那也沒關係,下面讓我用另一種關係說明;
武俠**版,這個是我引用別人的想法,並把他的想法吸收,最後用自己的語言表達出來,融會貫通,一氣呵成,
#includeusing namespace std;
int f[10000];
//找到自己的掌門(最上級)
void find(int x)
//合併他們(你指定讓誰和誰是乙個門派的)
void join(int x,int y)
int main()
int sum=0;
for(int i=1;i<=n;i++)
f[i]=find(i);//這部的作用就是讓所有人的直系關係都變成掌門
for(int i=1;i<=n;i++)
cout
}
並查集詳解
其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...
詳解並查集
並查集主要用來求解不相交集合的問題,主要針對於合併和查詢兩種演算法。並查集的實現主要包含了三個部分 並查集的初始化是對單個資料建立了乙個單獨的集合,每個集合應該包含以下兩個資料 由以上兩個資料,一般的並查集的結構一般有兩種表示形式 結構體構造如下 define max 50 struct node ...
並查集詳解
並查集是一種樹型的高階資料結構,主要用於處理不相交集合的合併及查詢問題。它在電腦科學中有著廣泛的應用,例如求解最小生成樹 親戚關係的判定 確定無向圖的連通子圖個數 最小公共祖先問題等,都要用到並查集。集合是數學中最基本的構造之一,將一組滿足某種性質的物件放在一起就形成了集合。集合中包含的物件稱為集合...