(並查集)食物鏈

2021-08-22 16:15:29 字數 2364 閱讀 3269

動物王國中有三類動物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每個動物都可以成為abc三個種類的任意乙個。

我如果用陣列a[3*n]表示乙個動物的三個種類,就是說如果動物標號為x,那麼a[x]表示種類1,a[x+n]表示種類2,a[x+2*n]表示種類3

如果兩個動物種類相同,那麼假如第乙個動物種類是a,那麼第二個動物種類一定是a,假如第乙個動物種類是b,那麼第二個動物種類一定是b,假如第乙個動物種類是c,那麼第二個動物種類一定是c。

也就是說無論他倆是a還是b還是c,都一定屬於同乙個集合。

用圖形表示的話

如果第1個動物吃第2動物,那麼我們假設出來所有可能情況,

a1吃b2,a2吃b3,a3吃b1. 因為這些可能情況可能發生,我麼假設他們每個情況在同乙個路徑裡面,就是說a1b2在一組,a2b3在一組,a3b1在一組

我們發現,如果用圖形表示現在我們的推論,應該是這樣的:

由於食物鏈的緣故

1吃2,2吃3.如果現在3吃1,那麼說明滿足自洽性

根據路徑關係,我們發現如果1吃3,則不成立,反而3吃1成立,所以可見我們食物鏈滿足

當我們碰到屬於同一類時,如果a1和b2在同一路徑,a1和b3在同一路徑那我們就要退出,碰到a吃b時,如果a1和b1在同一路徑,a1和b3在同一路徑,我們就要退出.這裡同一路徑意思是在同一集合裡

如滿足條件,那麼我們就連線上面影象上相連的那幾個結點,所謂連線就是加入到同乙個集和裡。

這裡我們根本沒考慮誰吃誰,而是直接加到集合裡,這就是連線方法的問題,從連線方式一看就知道誰吃誰了

上面這一切說明什麼呢,可以通過並查集模擬路徑,可以在輸入路徑的同時判斷是不是和之前已有路徑的產生矛盾

目前我只是拋磚引玉。

現在我思考這幾個部分:1.實物個數,2.實物種類,3.種類間關係,4.操作資訊

未來我會整合一下讓這個演算法更普適化。

**參考:

以及《挑戰程式設計競賽》

#include 

#include

#define max_n 500000

using

namespace

std;

int pre[max_n];

int n, k;

int ans = 0;

void init(int n)

}int find(int x)

return r ;

}void unite(int x, int y)

int main()

if (t == 1)

else

}else

else }}

cout

<< ans << endl;

return

0;}

並查集 食物鏈

noi2001,水題,但是我調了很久。食物鏈time limit 1000ms memory limit 10000k total submissions 27766 accepted 8066 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃...

並查集 食物鏈

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

並查集 食物鏈

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