并查集 HDU1232

并查集 HDU1232

 

#include < iostream >
#include
< stdio.h >
#include
< string .h >
using   namespace  std;

bool  flags[ 1001 ];
int  father[ 1001 ];

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

}


int  findset( int  x)
{
    
if(x!=father[x])
    
{
        father[x]
=findset(father[x]);
    }

    
return father[x];
}


void  Union( int  a, int  b)
{
    
int x=findset(a);
    
int y=findset(b);
    
if(x==y)
    
return;
        father[y]
=x;
}


int  main()
{
    
int n,m;
    
while(scanf("%d %d",&n,&m)!=EOF)
    
{
        memset(flags,
false,sizeof(flags));
        
if(n==0)
        
break;
        makeset(n);
        
int first,second;
        
for(int i=1;i<=m;i++)
         
{
             scanf(
"%d %d",&first,&second);
             Union(first,second);
         }

         
for(int i=1;i<=n;i++)//判断树的棵数
         {
             flags[findset(i)]
=true;
         }

         
int k=0;
         
for(int i=1;i<=n;i++)
         
{
             
if(flags[i]==true)
             k
++;
         }

         printf(
"%d\n",k-1);//需要增加的路数等于树的棵树k-1
    }

        
return 0;
}

你可能感兴趣的:(并查集 HDU1232)