POJ 1182 食物鏈(種類並查集)

2021-07-16 08:34:57 字數 2851 閱讀 5323

食物鏈time limit:1000ms

memory limit:10000k

total submissions:63592

accepted:18670

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

這題困擾了我很久,也一直不敢去做,因為看了很多的題解,都看不懂在講什麼,今天又拿出題解看了一下,總算是看懂一點門道了,先上大牛部落格:

poj 1182題解

然後一定要在紙上畫出這個題解中的所有關係的向量箭頭,其實說是向量相加,其實還是用數字加的,只是確實非常神奇地符合向量的相加結果(大牛的思想本渣還未完全明白)。

我也就再在大牛們的題解基礎上寫一下我的理解,也許能幫助更多的人理解這個意思。

首先按照題解中給出的關係進行一 一對應,即我們設的關係就是要跟(d-1)這個值一致。

先排除掉最簡單的兩種假話:比範圍n大以及自己吃自己。

然後考慮另外的情況即要開始檢驗兩者關係是否如題目所給出的d那樣;

顯然當兩者原本就沒有關係的時候,無論d是1或2,都是真話,那這些話有什麼用呢,就是給之後的假話鋪墊製造制約條件。當然對於這些話的處理就是要合併(在此題這種分組並查集的寫法中同乙個集合就不是指同乙個物種了,只要兩者存在捕食關係都會在同乙個集合裡,比如1吃2,2吃3,3吃1,那1、2、3都會在同乙個集合裡,只是誰當根節點的問題)

然後如何合併呢?你可以任選合併乙個方向如fx並到fy或fy並到fx(選完方向後之後的操作都要一致),但是要遵循祖先並到另乙個的祖先這個原則,即原來子代不並,但是把根節點直接接到另乙個根節點上去,但是這樣一來被合併的根節點關係可以立馬得到,但被牽連的子節點怎麼辦,當然就是要用路徑壓縮進行更新,為什麼要更新,合併之後父親節點都已經變化了,當然要更新,如何更新相信題解講的很清楚。

然後就是解法中說的x->y這個東西,你要自己在紙上對x->y連一條方向線,我原來找半天不知道x->y在哪,感覺根本無法得知啊,然後發現x->y其實就是題中所給關係即d-1……(如果你畫的沒錯的話第乙個情況是乙個四邊形,第二種是乙個三角形,箭頭與node.relation千萬別搞錯)

其次就是那個向量公式裡有幾處可能寫的比較難懂,箭頭就是指向量,然後幾個公式都有+3,是因為要正向取模,個人認為+3應該放到最後而不是中間。然後自己也靠著畫的圖和理解寫了乙份比較清晰的**(絕對不是某些大牛的殺馬特風格)用ppt簡單地做了兩張圖,希望沒錯………

最後這題還有乙個有毒的地方,請不要用while(scanf(......)!=eof),會wa

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

#define clr(x,y) memset(x,y,sizeof(x))

#define lc(x) (x<<1)

#define rc(x) ((x<<1)+1)

#define mid(x,y) ((x+y)>>1)

typedef pairpii;

typedef long long ll;

const double pi=acos(-1.0);

const int n=50010;

struct info

;info node[n];

void init()

else//根相同,這才是可能出假話的地方 

else if(d==2)

}} }

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

return 0;

}

POJ 1182 食物鏈 (種類並查集)

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

poj 1182食物鏈 種類並查集

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

POJ1182 食物鏈(種類並查集)

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