POJ 1182

 

POJ 1182_第1张图片

 

 

POJ 1182_第2张图片

 

const  int  maxn = 50008 ;
int    father[maxn] , relation[maxn] ;
int    n ;

void   init(){
       for(int i = 1 ; i <= n ; i++){
           father[i] = i ;
           relation[i] = 0 ;
       }
}

int    getf(int x){
       if(x == father[x]) return x ;
       int fx = father[x] ;
       father[x] = getf(fx) ;
       relation[x] = (relation[x] + relation[fx]) % 3 ;
       return father[x] ;
}

int    merg(int k , int x , int y){
       int fx = getf(x) ;
       int fy = getf(y) ;
       if(fx != fy){ // 不是同集合合并,当然是真话
            father[fy] = fx ;
            relation[fy] = (relation[x] - relation[y] + 3 + k-1 ) % 3 ;
       }
       else{   //同集合可能是假话,判断
            if((relation[y] - relation[x] + 3) % 3 != k-1)
               return 1 ;
       }
       return 0 ;
}


int   main(){
      int m , sum = 0 , x , y , k  ;
      scanf("%d%d" ,&n ,&m) ;
      init() ;  //初始化并查集
      while(m--){
           scanf("%d%d%d" , &k , &x , &y) ;
           if(x > n || y > n) sum++ ;
           else if(k == 2 && x == y) sum++ ;
           else sum += merg(k , x , y) ;
      }
      printf("%d\n" , sum) ;
      return 0 ;
}


 

 

 

你可能感兴趣的:(POJ 1182)