C語言資料結構拉練 並查集

2021-10-11 04:21:48 字數 3031 閱讀 9470

資料結構 = 結構定義 + 結構操作

結構定義

陣列 + 尺寸

數值相同的陣列索引標記為一類

#include

#include

typedef

struct unionset unionset;

結構操作

初始化/清除

unionset *

init

(int n)

return u;

}void

clear

(unionset *u)

查詢/合併(連通)

查詢時間複雜度:o(1)

兩點所處集合合併(連通)時間複雜度:o(n)

判斷兩點是否為同一集合o(1)將一點所屬集合的點併入另一點所屬集合中o(n)

int

find

(unionset *u,

int x)

intmerge

(unionset *u,

int a,

int b)

return1;

}

結構定義

陣列 + 尺寸

陣列記錄其所屬元素的索引

#include

#include

typedef

struct unionset unionset;

結構操作

初始化/清除

unionset *

init

(int n)

return u;

}void

clear

(unionset *u)

查詢與合併(連通)

查詢: 遞迴返回其最終的父元素索引, 時間複雜度:o(n)

合併(連通): 容易退化成單鏈, 提高時間複雜度

分別查詢兩點的最終父結點o(n)隨意將乙個作為另乙個的父結點o(1)

int

find

(unionset *u,

int x)

intmerge

(unionset* u,

int a,

int b)

結構定義

陣列 * 2 + 尺寸

陣列記錄其所屬元素的索引以及當前高度

#include

#include

#define swap(a, b)

typedef

struct unionset unionset;

結構操作

初始化/清除

unionset *

init

(int n)

return u;

}void

clear

(unionset *u)

查詢/合併(連通)

查詢: 遞迴返回其最終的父元素索引, 時間複雜度:o(logn)

合併(連通):

分別查詢兩點的最終父結點o(logn)交換操作保證a的深度最大

將深度小的點的父結點連到深度大的父結點上, 深度小的點的父結點深度 =+ 深度大的點父結點深度

int

find

(unionset *u,

int x)

intmerge

(unionset* u,

int a,

int b)

查詢時及時更新父結點

結構定義

陣列 + 尺寸

陣列記錄其所屬元素的索引

#include

#include

typedef

struct unionset unionset;

初始化/清除

unionset *

init

(int n)

return u;

}void

clear

(unionset *u)

查詢/合併

查詢複雜度: 約為o(1)

合併複雜度: 約為o(1)

int

find

(unionset *u,

int x)

intmerge

(unionset* u,

int a,

int b)

int

main()

}clear

(u);

return0;

}

資料結構(C語言描述)並查集

在一些應用問題中,需將n個不同的元素劃分成一組不相交的集合。開始時,每個元素組成乙個單元集合,然後按一定順序將屬於同一組元素的集合合併。其間要反覆用到查詢某個元素屬於哪個集合的運算。適合於描述這類問題的抽象資料型別稱為並查集。ufunion a,b,u 將並查集u中的集合a和b合併,其結果取名為a或...

資料結構 並查集

並查集,顧名思義,合併 查詢 集合 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。對於概念等等的這裡不再贅述,直接講解應用。應用1 判斷圖中有多少聯通分量 或者圖是否聯通 聯通分量 1 hdu 1213 應用2 判斷圖是否...

資料結構 並查集

time limit 1000ms memory limit 65536k 某城市有n個人,現在給定關於n個人的m條資訊,m條資訊是兩個人在同乙個小區,根據所給資訊,判斷這個城市最多可能有多少個小區。n個人編號為1 n。多組輸入。每組第一行有兩個整數n,m 2 n 50000,0 m n 2 接下來...