pku 2236 poj 并查集一般题
有n台坏掉电脑,有两种操作,O表示修好一台电脑,修好后就可以更新与其它已修好的电脑的关系了,即如果与某台已经修好的电脑在可以连接的范围内,则两台电脑建立联系,另一种操作是询问,直接找根节点就好。。。。是水题啊,不过有一些细节要注意啊。
View Code
#include<stdio.h>
#include<string.h>
#define MAX 1050
struct node{
int x,y;
}com[MAX];
int fa[MAX],repaired[MAX];
int n,d,tot;
void init()
{
for(int i=1;i<=n;i++)
fa[i]=i;
}
int find(int x)
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
int dis(node a,node b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void unio(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return ;
else fa[x]=y;
}
void update(int x)
{
for(int i=1;i<=tot;i++)
{
if(dis(com[repaired[i]],com[x])<=d)
unio(x,repaired[i]);
}
}
int main()
{
int i,p,q;
char str[5];
scanf("%d%d",&n,&d);d*=d;
tot=1;init();
for(i=1;i<=n;i++)
scanf("%d%d",&com[i].x,&com[i].y);
while(scanf("%s",str)!=EOF)
{
if(str[0]=='O')
{
scanf("%d",&p);
repaired[tot++]=p;
update(p);
}
else
{
scanf("%d%d",&p,&q);
int rp=find(p);
int rq=find(q);
if(rp==rq)
printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return0;
}
啰嗦一句,对知识的理解、领悟是永无止境。
ACM让我们变的更加严谨(不严谨是要付出时间的代价的,时间就是生命哪。。。。),继续努力!!!