資料結構 = 結構定義 + 結構操作
結構定義
陣列 + 尺寸數值相同的陣列索引標記為一類
#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 接下來...