POJ3908 Quick Answer 并查集

并查集主要操作:

(1)查找 int find(int x)

(2)连接 void Union(int a,int b)

(3)删除

通过查找并实现路径压缩,可降低树的高度。连接时,将高度低的树的根节点连接到高度高的树的根节点,可以提高查找的速度。

#include<stdio.h>
int f[50000];
int id[50000];
int rank[50000];
int find(int x)
{
  if(x!=f[x])

  f[x]=find(f[x]);

  return f[x];
}
void Union(int a,int b)
{
   a=find(a);
   b=find(b);
   if(rank[a]>=rank[b]) 
   {
    f[b]=a;
    if(rank[a]==rank[b])
    rank[a]++;
   }
   else if(rank[a]<rank[b]) f[a]=b;
}
int main()
{
   int n,a,b;
   char s[4];
   while(scanf("%d",&n)!=EOF)
   {
      int n1=0,n2=0;
      for(int i=1;i<=n;i++)
      {
         f[i]=i;
         id[i]=i;
         rank[i]=0;
      }
      while(scanf("%s",s),s[0]!='e')
      {
         if(s[0]=='q')
         {
            scanf("%d%d",&a,&b);
            a=find(id[a]);b=find(id[b]);
            if(a==b) n1++;
            else n2++;
         }
         else if(s[0]=='c')
         {
            scanf("%d%d",&a,&b);
            Union(id[a],id[b]);
         }
         else if(s[0]=='d')
         {
            scanf("%d",&a);
            id[a]=++n;
            f[n]=n;
            rank[n]=0;
         }
      }
      printf("%d , %d\n",n1,n2);
   }
   return 0;
}

posted @ 2012-01-27 11:19  HUJJ  阅读(216)  评论(0编辑  收藏  举报