是中文題意 我就不贅述了(源**在下面 壓**壓得很厲害,不要吐槽)
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...