题目:http://poj.org/problem?id=2236
方法一:
修好的电脑用k[i]=1标记,没有修好的用k[i]=0标记,构造并查集时用k[i]=1的
代码:
View Code
#include<stdio.h>
#include<math.h>
struct node
{
int x,y;
}s[1001];
int d;
int set[1001];
bool k[1001];
int distance(node a,node b)
{
if((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)<=d)
return 1;
return 0;
}
int find(int x)
{
int j,i=x;
if(x==set[x])
return x;
else
set[x]=find(set[x]);
while(set[x]!=i)
{
j=set[i];
set[i]=set[x];
i=j;
}
return set[x];
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
set[fx]=fy;
}
int main()
{
int n,num,i,x,y,p;
char ch;
scanf("%d%d",&n,&d);
d=d*d;
for(i=1;i<=n;i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
k[i]=0;
set[i]=i;
}
num=0;
getchar();
while(scanf("%c",&ch)!=EOF)
{
if(ch=='O')
{
num++;
scanf("%d",&p);
k[p]=1;
if(num!=1)
{
for(i=1;i<=n;i++)
{
if(k[i]&&distance(s[i],s[p]))
merge(i,p);
}
}
}
if(ch=='S')
{
scanf("%d%d",&x,&y);
if(find(x)==find(y)||distance(s[x],s[y]))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
getchar();
}
return 0;
}
方法二:
把修好的电脑放到数组p[]中,但时间上尽然比方法一还慢,并且在放入p时,i不能从0开始否则会re求高人指点
代码:
View Code
#include<stdio.h>
#include<math.h>
struct node
{
int x,y;
int k;
}s[1001],p[1001];
int set[1001];
int d;
int distance(node a,node b)
{
if((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+0.0<=d)
return 1;
return 0;
}
int find(int x)
{
int j,i=x;
if(x==set[x])
return x;
else
set[x]=find(set[x]);
while(set[x]!=i)
{
j=set[i];
set[i]=set[x];
i=j;
}
return set[x];
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
set[fx]=fy;
}
int main()
{
int n,i,j,w,x,y;
char ch;
scanf("%d%d",&n,&d);
d=d*d;
for(i=1;i<=n;i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
s[i].k=i;
set[i]=i;
}
i=1;
getchar();
while(scanf("%c",&ch)!=EOF)
{
if(ch=='O')
{
scanf("%d",&w);
p[i]=s[w];
i++;
if(i>1)
{
for(j=1;j<i-1;j++)
{
if(distance(p[j],p[i-1]))
merge(p[j].k,p[i-1].k);
}
}
}
if(ch=='S')
{
scanf("%d%d",&x,&y);
if(find(x)==find(y)||distance(s[x],s[y]))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}