題意是判斷兩台電腦是否能通訊,兩台修好的電腦距離在指定距離內可直接通訊,且兩台修好的電腦能通過一台修好的電腦間接通訊。代碼如下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int father[1005];
struct Coord //電腦坐標
{
int x;
int y;
} coo[1005];
struct Repair //已修復好的電腦的坐標和編號
{
int x;
int y;
int numb;
} rep[1005];
int Find_fath(int x) //並查集尋找父親
{
if (x != father[x])
father[x] = Find_fath(father[x]); //壓縮返回路徑
return father[x];
}
void Union(int x,int y) //並查集父親合並
{
x=Find_fath(x);
y=Find_fath(y);
if(x!=y)
father[y]=x;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,d;
int num_rep=0; //修復電腦的數量
char oper; //對電腦的操作
cin>>n>>d;
for(int i=1; i<=n; i++)
scanf("%d%d",&coo[i].x,&coo[i].y);
for(int i=1; i<=n; i++)
father[i]=i; //初始化父親為自己
getchar();
while(scanf("%c",&oper)!=EOF)
{
if(oper=='O')
{
int numb;
scanf("%d",&numb);
rep[num_rep].x=coo[numb].x;
rep[num_rep].y=coo[numb].y;
rep[num_rep].numb=numb;
for(int i=0; i<num_rep; i++)
{
if(num_rep==0)break;
int a,b;
a=rep[i].x-rep[num_rep].x;
b=rep[i].y-rep[num_rep].y;
if(a*a+b*b<=d*d)
Union(rep[i].numb,rep[num_rep].numb);
}
num_rep++;
}
else
{
int num1,num2;
scanf("%d%d",&num1,&num2);
if(Find_fath(num1)==Find_fath(num2))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
getchar();
}
return 0;
}
不足之處,望多指點改正。