題意是判斷兩台電腦是否能通訊,兩台修好的電腦距離在指定距離內可直接通訊,且兩台修好的電腦能通過一台修好的電腦間接通訊。代碼如下:
#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; }
不足之處,望多指點改正。