pku 1703 種類並查集

2021-09-09 00:17:10 字數 1015 閱讀 3952

思路;個人覺得本質上還是和帶權並查集一樣的,只不過多了乙個mod操作,然後就是向量關係圖稍微改動一下就變成種類並查集了,對於本題,我們可以用乙個kind陣列來表示是否屬於同一類,其中kind[x]==0表示不是同一類,kind[x]==1表示屬於同一類,這樣我們就可以得到向量關係式了(若r1=find(u),r2=find(v),並且parent[r1]=r2,那麼就有kind[v]+1==kind[u]+kind[r1])然後變形後對2取餘就可以了,即kind[r1]=(kind[v]-kind[u]+1)%2,這是union部分,還有路徑壓縮的時候注意更新一下kind就ok了。

1 #include2 #include3 #include4

using

namespace

std;

5#define maxn 100010

6int

parent[maxn];

7int

kind[maxn];8//

0表示不屬於同一類,1表示屬於同一類

9int

n,m;

1011

void

initiate()

1216 memset(kind,0,(n+2)*sizeof(kind[0

]));17}

1819

int find(int

x)20

24int tmp=find(parent[x]);

25 kind[x]=(kind[x]+kind[parent[x]])%2;26

return parent[x]=tmp;27}

2829

void union(int u,int

v)30

3637

intmain()

38else

else

if(kind[a]==kind[b])else59}

60}61}

62return0;

63 }

view code

POJ 1703 種類並查集

題意 乙個城市裡面有兩個黑幫 有兩種操作 a ask 詢問 x,y的關係 d x,y是一夥的 很明顯是種類並查集 於是就yy一下 relationsi 表示與父節點的關係 fatheri 記錄父節點 在合併和查詢root的時候 relations 更新注意一下就可以了 include include...

poj1703 種類並查集

種類並查集的應用 定義並查集為 並查集裡的元素i x表示i屬於幫派x 同乙個並查集的元素同時成立 可見所有元素個數為2 n,如果i表示屬於幫派a,那麼i n表示屬於幫派b,每次輸入兩個傢伙不在同一幫派的時候,就合併他們分屬兩個幫派的元素。輸入量比較大,要用scanf,用cin會超時 include ...

poj1703(種類並查集)

題目大意 警察抓獲n個罪犯,這些罪犯只可能屬於兩個團夥中的乙個,現在給出m個條件 d a b表示a和b不在同一團夥 對於每乙個詢問 a a b 確定a,b是不是屬於同一團夥或者不能確定。思路 如果父親和孩子是同乙個團夥,那麼孩子標記為0,如果不是的話,孩子標記為1.然後就是種類並查集的事情了.不難 ...