NC15167 集合問題(並查集)

2022-05-28 16:33:10 字數 1020 閱讀 1400

這道題目思維量還是挺大的,因為這道題也是維護集合關係,所以我們想到用並查集去維護。

我們應該想到的是,用map對映一下位置,因為原來的資料比較大,不宜維護並查集關係,並且設計兩個原點 0 和n+1,表示ab集合,這招是常見手段,因為這兩個點是特殊的。之前有到異或並查集也是設計乙個另外的原點

又因為x和a-x要是一體的,所以如果x和a-x都存在,那麼我們就把他們合併一下,如果不存在,那麼證明x必須要去b集合,因此我們將它和n+1合併

x和b-x同理。那麼合併完後,如果出現0和n+1的父親節點一樣,說明至少有乙個點兩個集合都要在,所以輸出no

否則,我們列舉看他屬於a還是b集合,這裡就出現了最關鍵的一點,也就是有些點兩個集合都可以在,所以優先考慮b

這是什麼情況呢,比如x1,x2,x3,x4

a-x1=x2

b-x1=x3

a-x4=x3

b-x4=x2

類似這樣的情況。所以這些點既沒有和0點相連,也沒有和n+1相連,所以在判斷的時候,要先判斷a,只有必須在a的才是a,其他都是b

#include#include

#include

#include

#include

using

namespace

std;

const

int n=1e5+5

;map

m1;intp[n];

ints[n];

int find(int

x)

return

p[x];

}void add(int a,intb)}

intmain()

for(i=1;i<=n;i++)

for(i=1;i<=n;i++)

int pa=find(0

);

int pb=find(n+1

);

if(pa==pb)

else

}return0;

}

view code

P1621 集合 尤拉篩 並查集

題目鏈結 這個題要求我們在乙個區間 a,b 中找出幾個集合,集合中的數滿足是乙個大於等於p的質因數的個數。看到集合這個定義,我們瞬間會想到用並查集來維護這個集合,那麼對於這個集合,他滿足乙個性質,就是如果我們,起始的時候初始化每乙個數的父親都是自己,那麼每乙個集合中有且只有乙個數的父親 是自己。根據...

合根植物(並查集)

如果我們告訴你哪些小格仔間出現了連根現象,你能說出這個園中一共有多少株合根植物嗎?輸入格式 第一行,兩個整數m,n,用空格分開,表示格仔的行數 列數 1格仔的編號一行一行,從上到下,從左到右編號。比如 5 4 的小格仔,編號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1...

並查集問題

輸入 第一行 城鎮數目n,道路數目m 接下的每一行表示 某條道路連線的城鎮號 輸出 至少還需要建設的道路數目,才能將所有的城鎮連線起來 例子 輸入 3 31 2 1 22 1 輸出 1解釋 要使城鎮123連通,還需要修建23之間的連通路 即還需要修建一條路 cpp實現問題求解 include usi...