POJ 1182 食物鏈 解題報告

2021-07-30 14:53:48 字數 1920 閱讀 6609

食物鏈

time limit:1000ms

memory limit:10000k

total submissions:70529

accepted:20875

description

動物王國中有三類動物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 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

sample output

3
source

noi 01

寫在前面

-------------------------------

此題為經典並查集,考察的較為全面,這道題算是做了很久都沒有思路的型別,之前看別人的部落格都不是很理解他們的思路,都是要找規律的,不太懂,並且提交了幾次都wa了。看了《挑戰程式設計競賽》中的解方案,豁然開朗,感覺清晰了很多,值得推薦 題解

-------------------------------

此題的解決方案是對於每只動物建立3個元素,i-a,i-b,i-c,並用3*n個元素建立並查集。

i-x表示「i屬於種類x」

並查集裡的每一組表示組內所有元素代表的情況同時發生或者不發生

第一種: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。

p.s.在合併之前,需要判斷合併是否產生矛盾

#include #include const int maxn = 1e6+7;

int n, k;

int par[maxn], rank[maxn];

int t[maxn], x[maxn], y[maxn];

void init(int n)

int find(int x)

void unite(int x, int y)

bool same(int x, int y)

void solve()

if (t == 1)

}else }}

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

}int main()

solve();

return 0;

}

POJ 1182 食物鏈 解題報告 (種類並查集)

傳送門 我的題解和大牛們的不一樣啊首先說,我每個權值代表的方向基本和網上的題解都是相反的,比如 權值1 代表 x 吃 他的父親節點,權值2 代表 x 被 他的父親節點吃。其實這樣的話就是相當於我建的樹和他們的是相反的。如果wa的話,可以單步執行一下union函式看一看,有可能在路徑壓縮的時候沒有成功...

POJ 1182 食物鏈 Union Find題解

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

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...