并查集简单题 题意表面是1000*20000的数量级 其实最坏只需要(1+1000)*1000/2次合并就行了。。。
#include<cstdio>
int n,d;
char order[10];
struct node{
int x,y;
}a[2000];
int fa[2000],am[2000],st[2000];
void init()
{
for(int i=1;i<=n;i++)
{
fa[i] = -1;
am[i] = 0;
}
}
int toGetFarther(int i)
{
while(!(fa[i]==i||fa[i]==-1))
i = fa[i];
return i;
}
void unon(int x,int y)
{
int fax = toGetFarther(x),fay = toGetFarther(y);
if(fax!=fay)
{
if(am[fax]>am[fay])
{
fa[fay] = fax;
am[fax]+=am[fay];
}
else
{
fa[fax] = fay;
am[fay] += am[fax];
}
}
}
int main()
{
scanf("%d%d",&n,&d);
int l1 = 0;
init();
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
while(scanf("%s",order)!=EOF)
{
if(order[0]=='O')
{
int to;
scanf("%d",&to);
if(fa[to]!=-1)continue;//如果已经修过就没必要再修了。。。
else{
fa[to] = to;
am[to] = 1;
for(int i=0;i<l1;i++)
if((a[st[i]].x-a[to].x)*(a[st[i]].x-a[to].x)+(a[st[i]].y-a[to].y)*(a[st[i]].y-a[to].y)<=d*d)
unon(st[i],to);
st[l1] = to;
l1++;
}
}
else
{
int st,en;
scanf("%d%d",&st,&en);
int stf = toGetFarther(st);
int enf = toGetFarther(en);
if(stf==enf&&stf!=-1)printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}
本文介绍了一个关于并查集的应用实例,通过一个具体的题目来演示并查集算法的实现细节。该实例涉及到了并查集的基本操作如初始化、查找根节点、合并集合等,并针对特定场景进行了优化。
2737

被折叠的 条评论
为什么被折叠?



