标签:
Description
Input
Output
Sample Input
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4
Sample Output
FAIL
SUCCESS
//题意是,电脑都坏了,可以一个一个修复,电脑只能在一定的距离内才能连通,在询问是否连通的时候输出是否连通。
第一行是 n ,d ,d 是代表电脑能连通的最大距离,然后是 n 行坐标,在然后是命令 O 代表修复电脑,S 代表查询两个电脑是否连通
并查集简单的应用,压缩了路径就只用了1秒
1125 ms
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 using namespace std; 5 6 struct Com 7 { 8 int x,y; 9 int on; 10 }com[1005]; 11 int p[1005]; 12 13 int find(int x) 14 { 15 if (x!=p[x]) 16 p[x]=find(p[x]); 17 return p[x]; 18 } 19 20 int Distance(int a,int b,double x) 21 { 22 double j=(com[a].x-com[b].x)*(com[a].x-com[b].x); 23 double k=(com[a].y-com[b].y)*(com[a].y-com[b].y); 24 double l=sqrt(j+k); 25 if (x<l) 26 return 1; 27 return 0; 28 } 29 30 int main() 31 { 32 int n,i; 33 double s; 34 scanf("%d%lf",&n,&s); 35 for (i=1;i<=n;i++) 36 { 37 scanf("%d%d",&com[i].x,&com[i].y); 38 com[i].on=0; 39 p[i]=i; 40 } 41 char str[2]; 42 int k; 43 while(scanf("%s",str)!=EOF) 44 { 45 if (str[0]==‘O‘) 46 { 47 scanf("%d",&k); 48 if (com[k].on==1) 49 continue; 50 com[k].on=1; 51 for (i=1;i<=n;i++) 52 { 53 if (i==k||com[i].on==0) //未修复 54 continue; 55 if (Distance(i,k,s))//距离超出 56 continue; 57 int fa=find(k); 58 int fb=find(i); 59 p[fa]=fb; 60 } 61 } 62 if (str[0]==‘S‘) 63 { 64 int a,b; 65 scanf("%d%d",&a,&b); 66 int fa=find(a),fb=find(b); 67 if (fa==fb) 68 { 69 printf("SUCCESS\n"); 70 //没有这种情况 71 /* if (a!=b) 72 printf("SUCCESS\n"); 73 else if (a==b&&com[a].on) 74 printf("SUCCESS\n"); 75 else 76 printf("FAIL\n");*/ 77 } 78 else 79 printf("FAIL\n"); 80 } 81 } 82 return 0; 83 }
标签:
原文地址:http://www.cnblogs.com/haoabcd2010/p/5766062.html