// 思路:對每個節點維護其到根節點的偏移量(偏移量代表種類關係)。
// 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...