對資料進行合併,查詢某個資料的祖先,建立資料間的聯絡。
int fathe[mx]
//根節點
int rank[x]
//樹的高度
void
ini()}
intfind
(int x)
intunite
(int x,
int y)
}
(1):wireless network
題意:有n臺電腦,電腦的覆蓋範圍為k公尺,在覆蓋範圍內任意兩台電腦可以互聯,現在所有的電腦都損壞了,給你這n臺電腦的座標,和兩種操作:o表示修復電腦p,s表示檢測兩台電腦是否可以互聯。
思路:用結構體陣列存貯電腦的位置座標,用陣列儲存所有以修復電腦的序號,當執行完修復操作時,將當前電腦與所有以修復電腦進行合併操作(合併前判定兩台電腦間的距離)。當執行檢查操作時 ,判斷兩台電腦是否為同一組。
#include
#include
#include
#include
#include
using
namespace std;
struct stu
f[1010];
int n,book[
1010
],num,fa[
1010
],k;
void
ini(
)int
find
(int x)
void
unite
(int x,
int y)
intcheck
(int x,
int y)
//判斷距離
intmain()
book[num++
]=x;
//儲存以修復的電腦序號
}else
if(ch==
's')
getchar()
;}return0;
}
(2)the suspects
題意:給定多個學生組,每組有k個學生,當每一組有乙個學生可能患病則該組所有學生都患病,初始只有0號學生可能患病,求可能患病學生數。
思路:標準的並查集,記錄每組的第乙個學生,然後其他學生與其合併,最後記錄所有學生中與零號學生為同一組的就可以。
#include
#include
#include
#include
#include
#include
using
namespace std;
vector<
int> q[
510]
;int n,m,k,f[
30010];
void
ini(
)//並查集模板
intfind
(int x)
void
unite
(int x,
int y)
intmain()
}for
(int i=
0;i<=n;i++
) cout<}return0;
}
並查集初步
有若干節點,並將其中一些節點對進行連線,要判斷任意兩個節點是否連通 有路徑到達,而不要求直接連線 連通後就不會斷開連通關係,此時就可以使用並查集。並查集擅長動態維護許多具有傳遞性的關係,能在無向圖中維護節點之間的連通性。要判斷兩個節點是否連通,可以把連通的節點加入到各自的集合裡,也就是,同乙個集合裡...
並查集初步
並查集可以動態維護若干個不重疊的集合,支援查詢和合併兩個操作,在實際應用中比較廣泛。並查集的主要功能是查詢元素的集合歸屬,同時支援集合的合併操作。並查集的實現方法 對於每個集合,選擇乙個元素作為其代表元素,而若兩個元素所在集合的代表元素相同,則說明它們在同乙個集合中。具體如何實現呢?有一種思路,可以...
並查集的初步學習
一 並查集是什麼 並查集是對一堆具有相互關聯的資料中快速找出兩個物件是否具有關聯關係的資料集合,這個問題看似簡單實際上牽扯到大量的計算。二 並查集的解決思路 a 先初始化乙個陣列,然後再讓這個陣列的內容指向本身。b 若這個陣列某個下標與某個下標具有關聯性,那麼就講某個下標的內容指向另乙個下標。解決這...