並查集小記

2021-05-24 11:47:08 字數 958 閱讀 5215

題目意思很簡單,給出m條道路連通的情況,求n個城市連通至少還需要建多少條道路。應該算是赤裸裸的並查集,不過也可以用prim。藉此道題目記錄一下並查集的應用。

1,定義乙個陣列set[1...n],其中set[i]表示元素i所在的集合;用編號最小的元素記錄所在集合;

//傳進merge()的a,b即是set[x],set[y].

find(int x)

merge(int a,int b)

2, 1中的演算法在進行合併操作時必須搜尋所有的元素,複雜度較大,所以可以採用樹結構。

定義陣列set[1...n],set[i]= i,i表示本集合,並是集合對應的根;set[i]=j,j<>(不等於)i,則j 是i 的父節點。

find(int x)

merge(int x,int y)

merge(int x,int y)

else if(height[x]4,進一步優化---壓縮路徑

每次查詢時,如果路徑較長,則修改資訊,以便下次查詢時速度更快。step:1,找到根節點,2,修改查詢路徑上所有的節點,將它們都指向根節點。

find(int x)

return r;

}

最後附上1232**:

#includeconst int maxn = 1005;

int set[maxn],height[maxn];

void creat(int n)

}int find(int x)

//路徑壓縮

return r;

}void merge(int x,int y)//將深度小的樹合併到深度大的樹中

else if(height[x]

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...