Poj 1182 食物鏈 (兩種思路)

2021-09-12 05:45:39 字數 1217 閱讀 4073

// 思路:對每個節點維護其到根節點的偏移量(偏移量代表種類關係)。

// par[x]表示x的根節點,rel[x]表示x與根節點的偏移量。

// rel[x]=0表示x與根節點為同類,1表示根節點吃x,2代表x吃根節點。

// 同類/不同類時,如何判斷關係是否矛盾以及如何合併兩頂點所在的集合。

#include#include#include#includeusing namespace std;

const int max_n=5e4+10;

int n,m;

int par[max_n];

int rel[max_n];

int find(int x)

} int main()

int k,x,y,ans=0;

for(int i=0;in||y>n||(k==2&&x==y))

int fx=find(x),fy=find(y);

if(fx==fy)

else

} printf("%d\n",ans);

return 0;

}

// 由於不確定動物屬於a、b、c的哪一類,對每只動物i建立3個元素a+i,b+i,c+i,並用這3*n個元素建立並查集。

// x+i:表示i屬於種類x

// 對於每個集合內的所有元素代表的情況都同時發生或不發生。

// 若動物x和y同類,則合併unite(a+x,a+y);unite(b+x,b+y);unite(c+x,c+y);

// 若動物x吃動物y,則合併 unite(a+x,b+y);unite(b+x,c+y);unite(c+x,a+y);

#include#include#include#includeusing namespace std;

const int max_n=2e5+10;

int n,m;

int par[max_n];

int find(int x)

bool same(int x,int y)

void unite(int x,int y)

int main()

if(k==1)

} else

} }

printf("%d\n",ans);

return 0;

}

POJ 1182 食物鏈(兩種解法)

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

POJ 1182 食物鏈 Union Find題解

union find就是所謂的並查集。本題做的很無語,最後發現居然是輸入搞錯,一直wa。不能使用迴圈接受輸入,否則是wa的,氣死人,浪費那麼多時間就為了這個。難點 1 構建關係樹 2 構建公式 3 快速更新公式 要抽象思維出什麼對應什麼的關係和上面是逆關係,就是利用0,1,2構建出父子節點之間的關係...

POJ 1182 食物鏈 解題報告

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