作用
連通分量的查詢與合併
理解
1.將連通分量看成乙個集合,該集合包含了連通分量的所有點。連同方式無關緊要,只有屬於和不屬於與這個集合的區別。
2.每個集合都可看成一棵樹,這個集合的標誌(這棵樹的標誌)就是這棵樹的根。
3.如果把節點x的父親節點儲存在pre[x]中,那麼再從pre[x]找它的父親節點pre[pre[x]],一直向上找就可以找到這棵樹的根。就是這棵樹的標記,當x沒有父親節點(x就是樹的根)那麼pre[x] = x。
下圖為查詢和合併兩個操作
另外還有路徑壓縮
路徑壓縮就是將樹中子節點的父親節點變成根(連通分量標誌)
這樣做的的好處是便於找到連通分量標誌 如圖
附上兩個操作**
查詢
int find(int x)
int find(int x)
return r;
}
合併
void union(int x,int y)
}
遞迴寫法(用於帶權並查集時實用)
int pre[maxn];
int find(int i)
int a,b;
void merge(int i, int j)
{ a = find(i);
b = find(j);
if(a == b)
return;
pre[a] = b;
並查集理解
學了這麼久的資料結構了,還是有好些演算法並沒弄清楚,搞得有些筆試題都是沒有思路,今天就講講並查集。感覺這東西吧,就是分圈子,乙個人自成乙個圈子,若分屬於兩個不同圈子的人在某時刻成了好朋友,那這兩個圈子就合併成了乙個圈子,最終在題目中形成多個圈子進行分析。判斷兩個人是不是乙個圈子要不停的找朋友驗證,這...
並查集的理解
並查集的模板,不理解也要背下來 include 萬能標頭檔案 using namespace std int par 100000 ran 10000 個數與深度 int n,m void init int n 初始化 當不需要返回值的時候,函式的型別標void。其實這個也是會返回乙個值,好像是呼叫...
並查集的理解
從數學的角度來說,假設我們有n個集合,而每個集合內又有眾多的元素,等等,每個集合的元素都存在這或多或少的聯絡,什麼聯絡不清楚,但我們只需知道存在這樣的關係即可 而突然,我們希望讓集合之間也聯絡起來,而又不想乙個乙個的將它們綁到一起,那麼,並查集就是解決它們之間聯絡的資料結構。樹就是我們需要用到的一種...