e - 食物鏈
poj - 1182
動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b, b吃c,c吃a。
現有n個動物,以1-n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。
有人用兩種說法對這n個動物所構成的食物鏈關係進行描述:
第一種說法是"1 x y",表示x和y是同類。
第二種說法是"2 x y",表示x吃y。
此人對n個動物,用上述兩種說法,一句接一句地說出k句話,這k句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。
1) 當前的話與前面的某些真的話衝突,就是假話;
2) 當前的話中x或y比n大,就是假話;
3) 當前的話表示x吃x,就是假話。
你的任務是根據給定的n(1 <= n <= 50,000)和k句話(0 <= k <= 100,000),輸出假話的總數。
input
第一行是兩個整數n和k,以乙個空格分隔。
以下k行每行是三個正整數 d,x,y,兩數之間用乙個空格隔開,其中d表示說法的種類。
若d=1,則表示x和y是同類。
若d=2,則表示x吃y。
output
只有乙個整數,表示假話的數目。
sample input
100 71 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
sample output
3
翻看《挑戰程式設計競賽(第2版)》之後發現的思路,感覺很棒
對於每只動物i建立三個元素i-a,i-b,i-c,並用這3×n個元素建立並查集,這個並查集維護如下資訊
i-x表示i屬於種類
並查集中每乙個組表示組內所有元素代表的情況都同時發生或不發生
第一種 x和y屬於同一種類 合併x-a和y-a,x-b和y-b,x-c和y-c
第二種 x吃y 合併x-a和y-b,x-b和y-c,x-c和y-a
合併之前需要判斷是否會產生矛盾
剩下的就是正常的合併查詢的並查集套路了
#include#include#include#include#include#include#include#include#includeusing namespace std;
int pre[150005];//大小是正常陣列的三倍,存放i-a,i-b,i-c三種元素
int find(int x)
void join(int x,int y)//合併同類
bool same(int x,int y)//判斷是否屬於同類
int main()
if(d == 1)//同類的情況
}else if(d == 2)//捕食關係}}
printf("%d\n", ans);
return 0;
}
poj1182 食物鏈(經典並查集)
題意 中文題 思路 最詳細的題解 include include include include include include include include include include include include include using namespace std define ma...
POJ 1182 食物鏈 經典並查集
食物鏈 time limit 1000ms memory limit 10000k total submissions 57770 accepted 16890 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...
POJ 1182 食物鏈 並查集經典
思路 設r x 表示節點x與根結點的關係,px表示x的根結點。記錄每個節點與其父節點的關係,就能很方便知道每個節點以及和它的父節點的關係。struct nodea maxn 關係 0表示同類,1表示父節點吃子節點,2表示子節點吃父節點 現在給定節點x和y,它們的關係是rel,如何判斷這句話是真還是假...