並查集應用
/* 這道題採用並查集的思路初始化3*N的並查集數組,x,x+N,x+2*N依次對應A,B,C物種,即par[x]=x;x爲A物種,par[x+N]=x+N;x爲B物種。以此爲前提後,給出的信息就可以進行如下操作:第一種x和y是同一物種,則合併(x,y),
(x+N,y+N),(x+2*N,y+2*N)。第二種x要喫y,則合併(x,y+N),(x+N,y+2*N),(x+2*N,y)即可。當然,在合併前應該先判斷一下是否產生矛盾,若有矛盾就計數加一。
*/
int T[max],X[max],Y[max];
int ans;//矛盾
int main(){
init(3*N); //並查集部分編碼在《算法競賽知識提要1》裏
//編號是0~N-1
for(int i=0;i<K;i++){
int x = X[i] - 1;
int y = Y[i] - 1;
if(x<0||x>=N||y<0||y>=N){
ans++;
continue;
}
if(T[i]==1){ //第一種x和y是同一物種
if(theSame(x,y+N)||theSame(x,y+2*N)){
ans++;
} else{
unite(x,y);
unite(x+N,y+N);
unite(x+2*N,y+2*N);
}
}else{ //第二種x要吃了y
if(theSame(x,y)||theSame(x,y+2*N)){
ans++;
}else{
unite(x,y+N);
unite(x+N,y+2*N);
unite(x+2*N,y);
}
}
}
cout<<ans<<endl;
return 0;
}
圖
- 什麼是圖
圖由頂點(vertex/node)和邊(edge)構成。頂點代表對象,邊代表對象之間的連接關係。頂點的集合爲V,邊的集合爲E的圖記爲G=(E,V),鏈接u和e的邊記爲e(u,v)。
- 無向圖和有向圖
無向圖的術語:相鄰的頂點的序列稱爲路徑,起點和終點重合的路徑叫做環或圈,一個圖中任意兩點都有路徑鏈接就是連通圖,否則就是非連通圖。頂點的邊數就是度。沒有環的連通圖稱爲樹,沒有環的非連通圖稱爲森林。一顆樹的總邊數爲頂點-1,反之總邊數爲頂點-1的連通圖就是樹。
帶權圖