POJ1182 食物鏈 並查集維護各種關係

2021-10-03 05:08:20 字數 1421 閱讀 5785

原題傳送門

對並查集而言已經算是比較難的一道題了,不過啃掉了之後收穫還算是比較大的

abc三種動物形成乙個食物鏈,a->b->c->a,有n

nn種動物,每種動物都是三者中的一種,但是具體的種類不知道

給定很多組說法,

第一種:「1 x y」,xy同類。

第二種說法"2 x y",表示x吃y。

對n

nn個動物,給k

kk個說法,每個說法有可能是假的,假的有三種情況

1) 當前的話與前面的某些真的話衝突,就是假話;

2) 當前的話中x或y比n大,就是假話;

3) 當前的話表示x吃x,就是假話。

輸出假話的數目

結果要求假話的數目,那我們必須能判斷哪一句話才是假話,條件2)3)顯然特判即可(3正常判斷也可以),具體在於怎麼才算衝突。正常並查集只能知道他們到底是不是同一類,怎麼知道誰吃誰呢?為了維護這種動物之間的關係,應該多開幾個陣列,其實白書中的講解仔細一看已經很透徹了:

此時應該維護的不是動物屬於哪一類,更關鍵的是種類之間的關係,如果有兩種,那麼開2n的陣列,這裡有三種,開3n的陣列,第乙個0-n表示元素屬於a,n-2n:b,2n-3n:c.

比如1,102,203一組,即1-a 2-b 3-c,但是乙個正常資料顯然要更新三組。如果狀態是對的,那麼所有組都是可以成立的,因此對於合法性檢查,只需要判斷x-a,和y的其他情況即可,不用再判斷x-b然後列舉y的類別。

ac**

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define ll int

#define n 100005

#define inf 2<<20

ll n, m, i, ans =0;

ll l, p;

ll kind[

3* n]

;//3*n的並查集,維護各種關係。

ll find

(ll elem)

bool

similar

(ll a, ll b)

void

unit

(ll a, ll b)

intmain()

}else}}

} cout << ans << endl;

}

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

POJ 1182 食物鏈 (並查集)

食物鏈time limit 1000ms memory limit 10000k total submissions 48713 accepted 14202 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編...

POJ 1182 食物鏈(並查集)

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