動物王國中有三類動物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 ...