原題**:
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 擴充套件並查集在原有的基礎上增加了節點之間的關係。即用rela[x]陣列表示x與x父節點關係。
以這道題為例。
rela[x]=0表示x與父節點為同類
rela[x]=1表示x吃父節點
rela[x]=2表示x被父節點吃
首先初始化
void init(int n)
}
每個節點的父節點為本身,其與父節點的關係為同類(0)
當輸入其不是同類並且自己吃自己,數量加一
當輸入超過個數時數量加一
然後看find函式
int find(int x)
所謂向量關係:
想象集合中節點之間的連線方式。x->par[x],rela[x] 前者表示向量方向,後者表示向量數值。
舉個例子吧。
圖中表示2吃1,1吃3.通過向量關係我們可有式子
2->1==1
3->1==2
=>2->3==2->1+1->3==1-2==-1
這個時候我們要把數值弄到0~2之間,讓-1+3==2
這時我們知2->3==2,即3吃2.
這個例子只是讓人更好記這種方式,並非證明。
我們回到find函式中對rela[x]重新賦值的問題。當對集合進行路徑壓縮後,父子之間的關係發生了改變。根節點下面的所有子孫節點直接連到根節點上,這時為了同步rela[x]要讓其同時改變。
來自我們通過剛才的向量關係可知,rela[x]+rela[t]==x->rootx+rootx->rootxx=x->rootxx。這樣就使壓縮路徑的同時同步rela[x]。
注意,能夠直接這樣做的原因是每次想要更新每個集合都要對其進行壓縮路徑,樹的高度為2。
合併:
void unite(int r1, int r2,int a, int b, int c)
rooty->rootx=rooty->y+y->x+x->rootx,**實現如上。
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define mem(arr,a) memset(arr,a,sizeof(arr))
#define power(a) (a*a)
#define n 50010
int par[n];
int rela[n];
void init(int n)
}int find(int x)
void unite(int r1, int r2,int a, int b, int c)
int main()
if (b > n || c > n)
int r1 = find(b);
int r2 = find(c);
if (r1 != r2)
else
if (a == 2 && (rela[b] - rela[c] + 3) % 3 != 1)}}
cout
<< sum << 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是...