樹的應用並查集(模板 例題)

2021-10-24 17:00:50 字數 1278 閱讀 1468

資料結構【並查集(模板+例題)】

並查集 :

實現集合的快速合併與查詢

用樹儲存乙個集合

如果兩個點有共同的跟,他們就在乙個集合裡

合併兩個點所在集合只需要吧乙個點的根接到另乙個點的跟下邊

**如下(示例):

#includeusing namespace std;

int fa[10010];//儲存結構

int find(int root)

while(son != root) //路徑壓縮 }

void unit(int x,int y)

}int main()

while(m--)

return 0;

}

輸入

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5輸出3

思想:從一句話開始,將正確的關係合併 。

對於同類的判斷 :

不知道x,y是那種動物,就假設x是a(由於每次加入集合操作,都把x,y對應的三個物種都加入,所以只需要判斷一種情況)

則如果y是b或c類,即正確的關係集合中有 x—y+n 說明x,y 是吃與被吃的關係 就說明當前的話不正確

find(x) == find(y+n) || find(x) == find(y+2*n);

對吃的判斷:

如果 在正確關係集合中發現 x,y是同類 或者x被y吃 則不正確

find(x) == find(y) || find(x) == find(y+2*n);

ac**:

#includeusing namespace std;

int fa[200000]; //開三倍的陣列 0 - n-1 存a;n - n*2-1 存b;

int n,m;

int find(int root) //查詢

while(son != root) //壓縮

return root;

}void unit(int x,int y) //合併

}int main()

for(int i=0;i>k>>x>>y;

if(x>n || y>n)

if(k==1)

else//這句話和之前的正確集合不衝突,把這句話加入正確集合。

}else //判斷x吃y關係

else

}} cout《還有幾個例題,慢慢補上。

並查集例題

題目描述 假如已知有n個人和m對好友關係 存於集合r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈。請寫程式求出這n個人裡一共有多少個朋友圈。輸入 輸入包含多個測試用例,每個測試用例的第一行包含兩個正整數 n m,1 n,m 100000。接下來有m行,每行分別輸入兩個...

並查集例題

找出根節點,如果只有乙個節點,根節點是自己 作迴圈,如果父節點不是自己,一直迴圈 public int find int x return x public void union int x,int y parent rootx rooty count 並查集自己的理解 剛開始每個節點都是看作單獨的...

並查集的例題

題意為 已知學校有n個學生 想知道有多少個宗教,但是不能乙個乙個問學生 已知兩個一起的是乙個宗教的,現可以問m對學生,請求出最多有多少個宗教 輸入資料 10 4 2 3 4 5 4 8 5 8 答案為7 由題知採用並查集求解 可看做二叉樹 include using namespace std co...