種類並查集(POJ1703)

2021-10-08 23:06:02 字數 1223 閱讀 7684

圖學的有點自閉,再加上用到了並查集、模擬棧、搜尋,先補一下這些相對基礎的東西

跟普通並查集區別:

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)"了

**決定搗毀兩大犯罪團夥:龍幫和蛇幫,顯然乙個幫派至少有一人。該城有n個罪犯,編號從1至n(n<=100000。將有m(m<=100000)次操作。

d a b 表示a、b是不同幫派 a a b 詢問a、b關係 input 多組資料。第一行是資料總數 t (1 <= t <=

20)每組資料第一行是n、m,接下來m行是操作 output 對於每乙個a操作,回答"in the same gang.「或"in

different gangs.」 或"not sure yet."

最開始思路是兩個陣列,跟這個有點相似,不過沒分析明白,轉而更加偏向用結構體,不過寫不出來。

思路參考別人的題解,學習到了種類並查集。感覺像是找了個跳板。自己重新寫了一遍。**簡潔明瞭。

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

100005

;int s[

2* maxn]

;int

find

(int x)

return r;

}void

union_set

(int a,

int b)

intmain()

if(flag ==

'a')}}

#ifdef local

printf

("time used = %.2f\n",(

double

)clock()

/ clocks_per_sec)

;#endif

return0;

}

種類並查集(POJ 1703)

1703 find them,catch them 題目大意 有2個敵對幫派,輸入d a b表示a,b在不同幫派,輸入a a b表示詢問a,b是否是在乙個幫派。題解 因為並查集中的元素均是有聯絡的,否則也不會被合併到當前集合中。那麼我們就把這2個元素之間的關係量轉化為乙個偏移量,假設 x y 偏移量...

種類並查集,Poj 1703

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

POJ 1703 種類並查集

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