題解 並查集 食物鏈

2021-09-13 22:51:11 字數 2990 閱讀 1580

題目描述:

動物王國中有三類動物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),輸出假話的總數。

輸入格式

第一行是兩個整數n和k,以乙個空格分隔。 以下k行每行是三個正整數 d,x,y,兩數之間用乙個空格隔開,其中d表示說法的種類。 若d=1,則表示x和y是同類。 若d=2,則表示x吃y。

輸出格式

只有乙個整數,表示假話的數目。

分析:這道題經過題意轉化後其實就是乙個比較複雜的關係處理。

因為這道題需要同時處理同類食物天敵之間的關係。

想到關係處理,我們可能會想到兩種方式: 圖

圖圖 和 並查集

並查集並查

集這道題用圖不是不能做,不過顯然比用並查集麻煩。

所以這道題就是一道並查集的題目。

所以我們根據題意,發現可以定三個並查集,也就是將並查集的長度擴充套件到三倍長。

注:最好不要用多個並查集來儲存關係,因為他們之間並沒有共同點,對於關係的處理也就會出錯(就是這麼錯過來的…………)

我們設:

f a[

i]表示

以i為編

號的父親

fa[i]表示以i為編號的父親

fa[i]表

示以i為

編號的父親1、

處理i的

同類的關

系(

1<=i

<=n

)1、處理i的同類的關係 \ (1<=i<=n)

1、處理i的

同類的關

系(1<=i

<=n)2、

處理i的

天敵的關

系(n+

1<=i

<=2

∗n

)2、處理i的天敵的關係\ (n+1<=i<=2*n)

2、處理i的

天敵的關

系(n+

1<=i

<=2

∗n)3、處

理i的食

物的關係

(2∗n

+1

<=i

<=3

∗n

)3、處理i的食物的關係 (2*n+1<=i<=3*n)

3、處理i的

食物的關

系(2∗

n+1<=i

<=3

∗n)

那麼題目中說的假話也就是與之前話衝突的話,那麼怎麼樣算與之前衝突的呢?

有四種情況:

1 、同

類吃同類

1、同類吃同類

1、同類吃同類2、

同類吃天

敵2、同類吃天敵

2、同類吃天敵3、

和天敵是

同類

3、和天敵是同類

3、和天敵是

同類4 、和

食物是同

類4、 和食物是同類

4、和食物是

同類那麼只要按照以上四中關係處理即可。

/*

1、同類吃同類

2、同類吃天敵

3、和天敵是同類

4、 和食物是同類

1-n 同類

n+1-2*n 天敵

2*n+1-3*n 食物

*/#include

using

namespace std;

int fa[

1000001];

int n,m;

int ans=0;

intgetfa

(int k)

intmain()

if(z==

2&&x==y)

if(z==1)

//3if

(getfa

(x+2

*n)==

getfa

(y)&&x!=y)

//4 fa[

getfa

(x)]

=getfa

(y);

fa[getfa

(x+n)]=

getfa

(y+n)

; fa[

getfa

(x+2

*n)]

=getfa

(y+2

*n);}if

(z==2)

//1if

(getfa

(x+n)

==getfa

(y))

//2 fa[

getfa

(x)]

=getfa

(y+n)

; fa[

getfa

(x+n)]=

getfa

(y+2

*n);

fa[getfa

(x+2

*n)]

=getfa

(y);}}

printf

("%d"

,ans)

;fclose

(stdin);

fclose

(stdout);

return0;

}

並查集 食物鏈

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