利用並查集維護兩個對立集合

2021-08-18 02:18:55 字數 701 閱讀 1284

在並查集的實際應用中,我們經常遇到下列這種情況的題目

當滿足1、x,y為不同集合的元素

2、x,z為不同集合元素

時,y,z為相同集合的元素

如何來描述這種不同集合元素的關係就是我們接下來要學習的內容了

我們知道並查集可以用來描述相同集合的元素,所以我們可以根據這一特性稍做手腳。

當x和y為不同集合的元素時,我們令x+n和y屬於同一集合,相對的x和y+n屬於相同集合

故此當same(x,y)或same(x+n,y+n)為真時,x和y屬於同乙個集合

當same(x+n,y)或same(x,y+n)為真時,x和y屬於不同集合

否則x,y的關係不確定

例題poj1703

參考**

#include#define n (2 * 100100)

int pa[n];

void init(int n)

int findset(int x)

void union(int x, int y)

bool same(int x, int y)

int main()

if(c == 'a')}}

return 0;

}

POJ 1703並查集(區分兩個集合)

題意 輸入n,m。n個人,m個規定 詢問。一共有兩個集合,a 詢問a,b是否在同乙個集合?d 表明a,b不在同乙個集合。輸出有三種,不在同一集合,在同一集合,不確定。解析 其實有點離散化的意思。傳統並查集是合併兩個集合,而這個題是分開兩個集合。那麼可以這麼做,想辦法進行合併操作。輸入a,b,a,b沒...

求兩個集合的交集和並集

交集 用兩個指標分別指向兩個陣列的頭部。如果其中乙個元素比另乙個小,後移小的那個陣列的指標 如果相等,那麼把該元素新增到交集裡,同時後移兩個陣列的指標。一直這樣操作下去,直到有乙個指標超過陣列範圍。public list intersection int a,int b else return re...

計算兩個集合的交集 並集 差集 對稱集

計算 兩個集合的交集 並集 差集 對稱集 import sys import time 重新整理緩衝區 def flush time.sleep 1 除去重複元素 def duplicate removal lt lt1 for i in lt if i not in lt1 return lt1 ...