poj p1182解題報告 帶權並查集)

2021-06-28 04:45:50 字數 1692 閱讀 1078

是中文題意   我就不贅述了(源**在下面  壓**壓得很厲害,不要吐槽)

13778373

nailer

1182

accepted

568k

250ms

c++798b

2015-01-13 17:50:18

通過總結網上的大神的解釋  我總結了一篇筆記(以食物鏈為例,花了兩節自習課,真是呵呵了)

我們用d-1(也就是輸入中所給的1,2)表示x對y的關係

也就是  x和y同類     0

x吃y             1

x被y吃          2

假如我們設ty,tx為y,x的爹

那麼通過列表我們可以得到如下的結論(其中type 為0時x,y同類;為1時,x吃y)

type00

0011

111delta[x]00

0101

221delta[y]01

2222

121delta[ty]02

1220

211

tx  ty| |

x ~ 

y之後我們可以得到如下**(上面的那個表可以用筆來劃一劃,畫成如上圖乙個類似矩形的玩意,標上方向更有利於下文的理解)

void link(int x,int y)

fa[ty]=tx;

d[ty]=(d[x]-d[y]+3+d-1)%3;

根據題目 我們知道一共只有3類動物  那麼x,y一定存在著某種聯絡(來自poj的discuss),並且並查集中的一定有某種聯絡,不然並進來幹嗎?

那麼我們可以用向量的知識來解答這道題

如果x->y的偏移量是0時    x,y是同類

如果x->y的偏移量是1時    x吃y

如果x->y的偏移量是2時    x被y吃

之後任意給出的兩元素的關係便可以計算了

我們先分一下類

1  tx!=ty(ty和tx並無關係)

tx->ty = tx->x + x->y + y->ty(向量思想)

那麼只需要把x,y按要求合併即可

2  ty==tx

x->y=x->tx+tx->y=x->tx+ty->y

那麼x->y = (3-deltx[x]+deltx[y])%3

上述的值如果和d-1一致則為真  否則為假

好了好了,就這樣了下面是源**(不要純抄)

#include

#include

#include

#include

#include

using namespace std;

//nailertt

int d[50010],fa[50010],x,y,f,ty,tx,ans=0,n,m;

int nailerfind(int x)

return fa[x];}

void nailerbuild(int n)}

void nailerlink(int x,int y)

int solve(int f,int x,int y)

ty=find(y),tx=find(x);

if(f==1&&x==y)

if(tx==ty)

if(tx!=ty)

}int main()

printf("%d",ans);

return 0;

}

poj 1182 帶權並查集

description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是...

poj1182 帶權並查集

題意 中文題就不描述了 思路 帶權並查集模板題 加入乙個陣列 表示這個點和它父節點的關係 表示同類,表示父親吃它,表示它吃父親 每次需要更新和父親之間的關係 include includeconst int n 50005 int p n r n n,k void init int x int fi...

POJ 1182 帶權並查集

食物鏈 time limit 1000ms memory limit 10000k total submissions 89563 accepted 26905 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...