PKU 1182 食物链

#include  < iostream >
using   namespace  std;

struct  type1
{
    
int  parent;
    
int  rank;
} FOOD[
50001 ];

int  find( int  i)
{
    
int  t  =  FOOD[i].parent;

    
if  (t  <   0 )
        
return  i;
    FOOD[i].parent 
=  find(t);
    FOOD[i].rank 
=  (FOOD[t].rank  +  FOOD[i].rank)  %   3 ;
    
return  FOOD[i].parent;
}

int  main()
{
    
int  n, k;
    
int  d, x, y, i;
    
int  a, b;
    
int  lie  =   0 ;

    scanf(
" %d %d " & n,  & k);
    
for  (i  =   1 ; i  <=  n; i ++ )
    {
        FOOD[i].parent 
=   - 1 ;
        FOOD[i].rank 
=   0 ;
    }
    
for  (i  =   0 ; i  <  k; i ++ )
    {
        scanf(
" %d %d %d " & d,  & x,  & y);
        
if  (x  >  n  ||  y  >  n)
            lie
++ ;
        
else   if  (d  ==   1 )
        {
            a 
=  find(x);
            b 
=  find(y);
            
if  (a  ==  b)
            {
                
if  (FOOD[x].rank  !=  FOOD[y].rank)
                    lie
++ ;
            }
            
else
            {
                FOOD[a].parent 
=  b;
                FOOD[a].rank 
=  (FOOD[y].rank  -  FOOD[x].rank  +   3 %   3 ;
            }
        }
        
else     /*  d == 2  */
        {
            
if  (x  ==  y)
                lie
++ ;
            
else
            {
                a 
=  find(x);
                b 
=  find(y);
                
if  (a  ==  b)
                {
                    
if  (FOOD[x].rank  !=  (FOOD[y].rank  +   1 %   3 )
                        lie
++ ;
                }
                
else
                {
                    FOOD[a].parent 
=  b;
                    FOOD[a].rank 
=  (FOOD[y].rank  -  FOOD[x].rank  +   4 %   3 ;
                }
            }
        }
    }
    printf(
" %d\n " , lie);
    
return   0 ;
}

你可能感兴趣的:(pku)