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;
}