種類並查集(POJ 1703)

2021-06-18 00:17:13 字數 994 閱讀 6610

1703 -- find them, catch them

題目大意:有2個敵對幫派,輸入d a b表示a,b在不同幫派,輸入a a b表示詢問a,b是否是在乙個幫派。

題解:因為並查集中的元素均是有聯絡的,否則也不會被合併到當前集合中。那麼我們就把這2個元素之間的關係量轉化為乙個偏移量, 假設

x->y 偏移量0時 x和y同幫派

x->y 偏移量1時 x和y不同幫派

不妨繼續假設,x的當前集合根節點tx,y的當前集合根節點ty。

如果tx和ty不相同,那麼我們把ty合併到tx上,並且更新deltx[ty]值(注意:deltx[i]表示i的當前集合根節點到i的偏移量!!!!)

此時 tx->ty = tx->x + x->y + y->ty,可能這一步就是所謂向量思維模式吧

上式進一步轉化為:tx->ty = (deltx[x]+1-deltx[y])%2 = deltx[ty],(模2是保證偏移量取值始終在[0,1]間)

接下來把這個想法再運用到路徑壓縮中:

ffx   

fx      \

x     

路徑壓縮過程中會將fx的父親變為x的父親,所以要改變相對關係,即偏移量。

ffx->fx+fx->x=ffx->x;

轉換成:delta[x]=(delta[fx]+delta[x])%2;

即int find(int x)

#include int

n;int fa[100001],delta[100001]; //

deltx[i]表示i的當前集合根節點到i的偏移量

void

init()

}int find(int

x)void merge(int x,inty)}

intmain()

else

printf(

"not sure yet.\n");}}

}return0;

}

view code

種類並查集(POJ1703)

圖學的有點自閉,再加上用到了並查集 模擬棧 搜尋,先補一下這些相對基礎的東西 跟普通並查集區別 1 陣列開兩倍 2 union set a n,b 和union set a,b n 3 判斷 find a find b 同隊 find a find b n 不同隊 不需要再 f a n f b n ...

種類並查集,Poj 1703

第一次做種類並查集,有的地方還不是很清楚,想了一上午,有點明白了,這裡記錄一下。這裡我參考的紅黑聯盟的題解。關鍵 種類並查集與帶權並查集實質上的差別並不大,關鍵的區別就是種類並查集只是帶權並查集再弄個 取餘操作而已,然後餘數就表示他屬於哪個種類。rank陣列表示節點和父節點的關係 也可以理解為他的種...

POJ 1703 種類並查集

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