算法競賽知識提要2

並查集應用

這裏寫圖片描述

/* 這道題採用並查集的思路初始化3*N的並查集數組,x,x+N,x+2*N依次對應A,B,C物種,即par[x]=x;x爲A物種,par[x+N]=x+N;x爲B物種。以此爲前提後,給出的信息就可以進行如下操作:第一種xy是同一物種,則合併(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){ //第一種xy是同一物種
         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;
}


  1. 什麼是圖

圖由頂點(vertex/node)和邊(edge)構成。頂點代表對象,邊代表對象之間的連接關係。頂點的集合爲V,邊的集合爲E的圖記爲G=(E,V),鏈接u和e的邊記爲e(u,v)。


  • 無向圖和有向圖

無向圖的術語:相鄰的頂點的序列稱爲路徑,起點和終點重合的路徑叫做環或圈,一個圖中任意兩點都有路徑鏈接就是連通圖,否則就是非連通圖。頂點的邊數就是度。沒有環的連通圖稱爲樹,沒有環的非連通圖稱爲森林。一顆樹的總邊數爲頂點-1,反之總邊數爲頂點-1的連通圖就是樹。
這裏寫圖片描述
帶權圖
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章