No 7 2 並查集演算法

2022-09-09 15:54:31 字數 1000 閱讀 2515

暫時沒看懂,只做記錄,後續再究!

一、求有幾個強盜同夥?

現在有10個強盜:

1與2是同夥;  3與4是同夥;

5與2是同夥;  4與6是同夥;

2與6是同夥;  8與7是同夥;

9與7是同夥;  1與6是同夥;

2與4是同夥;

強盜同夥的同夥,也是同夥。請問共有幾個獨立的強盜同夥?

解題思路:

1.首先假設10個強盜各不相屬,用一維陣列表示 f[i] = i

2.合併同夥:如果兩人是同夥,以靠左原則為準,比如:「5與2是同夥,左邊是5,那麼2從屬於5」  <=>

1). u,v ( f[u]=u, f[v]=v ), 靠左原則 f[v]=u;

2). w,v ( f[w]=w, f[v]=u ), "擒賊先擒王"原則,u,v 都要從屬於 w, 即 f[v]=w; f[u]=w;

3). v, x ( f[v]=w, f[x]=x ), x 從屬於 v,f[x] = f[v] = w;

上述過程即並查集演算法:每個點開始都是只有乙個節點的樹,通過一些條件合併成一顆大樹,合併過程要遵循靠左原則和擒賊先擒王原則,找到相同的父節點和根節點。

二、code

int t[100]=,n,m;

//初始化,t[i]=i,表示每個點都是自己的父節點,相互之間沒有關係

void init()

}int getf(int v)

}/* 其實這個函式用一句就可以代替:t[ getf(y) ] = t[ getf(x) ];

void merge(int x,int y)

}int main()

for(i=1;i<=n;i++)

printf("%d ",t[i]);

for(i=1;i<=n;i++)

printf("\n%d\n",num);

getchar();getchar();return 0;

}三、**不大,演算法也不難,關鍵是怎麼分解、實現。這是才是入門的基礎!

並查集演算法

所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...

並查集演算法

並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。1 makeset s 建立乙個新的並查集,包含s個單元素集合。2 union x,y 把x ...

並查集演算法

includeint pre 10 int find int x 查詢祖先節點 int i x,j while i r 壓縮路徑 return r void join int x,int y int main 2 食物鏈問題 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈...