食物鏈
time limit:1000ms
memory limit:10000k
total submissions:55882
accepted:16377
description
動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a**, 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 7sample output1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
3source
noi 01
以食物鏈為例,並查集是維護屬於同一組的資料結構,但是本題不只有同一組,還有捕食關係。
對每只動物建立三個元素 i-a i-b i-c,用3 x n個元素建立並查集。
i - x 表示 i 屬於種類x
並查集的每乙個組,表示組裡所有元素代表的情況,同時發生或者同時不發生
例如 如果 i-a j - b在乙個集合裡,說明 i 屬於a的同時 j一定屬於b,
所以對應題目中的兩種情況,
1 x ,y屬於同一種類,那麼我們就合併 x-a y-a , x-b y-b , x-c y-c;
2 x吃 y ,那麼我們就合併 x-a y-b , x-b y-c , x-c y-a;
當然合併的時候要進行判斷是否有矛盾,具體來看**吧
以上參照了挑戰程式設計競賽
【原始碼】
#include#includeusing namespace std;
const int maxn = 50000 + 10l;
int father[maxn * 3];
int find(int x)
void union(int x,int y)
bool same(int x,int y)
int main()
if(t == 1)
}else
}// cout<
hdu1829
給出 一對一對蟲子的關係,可能是 公-母 也可能是 母-公
判斷給出的關係對會不會出現同性的情況。
同樣可以用上面的方法,對於每種關係 建立兩個集合 union(x,y+n) union(y,x+n)
這兩個集合有乙個是真的。
然後在每次合併之前檢查 x,y是否在同一集合即可,如果在同一集合就輸出找到錯誤。
【原始碼】
#include#includeusing namespace std;
const int maxn = 2000 + 10l;
int father[maxn * 3];
int find(int x)
void union(int x,int y)
bool same(int x,int y)
int main()
int i;
int fla = 0;
for(i=1;i<=n;i++)
}} printf("scenario #%d:\n", ++kase); //因為少了這句!! t^t
if(!fla)
cout<<"no suspicious bugs found!"<
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...
POJ 1182 食物鏈 並查集
此題利用並查集解決。對於每只動物i建立3個元素i a,i b,i c,並用這3 n個元素建立並查集。1 i x表示 i屬於種類x 2 並查集你的每一組表示組內所有元素代表的情況同時發生或不發生。對於每一條資訊,只需要按照下列操作即可 1.第一種 x,y同類,合併x a和y a x b和y b x c...