poj2236 Wireless Network
每修好一台电脑后就逐一与之前修好的电脑进行距离计算,若距离小于等于d则加入同一集合。
写的时候各种不认真,wa了好几次,应该好好批评下自己。
1 #include<cstdio> 2 #include<string.h> 3 #include<iostream> 4 #include<math.h> 5 const int maxn=1010; 6 int p[maxn],n,d,repair[maxn],k; 7 struct Node 8 { 9 double x,y; 10 bool flag; 11 }node[maxn]; 12 13 void init() 14 { 15 int i; 16 for(i=1;i<=n;i++) 17 { 18 p[i]=i; 19 node[i].flag=false; 20 } 21 k=0; 22 } 23 24 double dis(int a,int b) 25 { 26 double L=(node[a].x-node[b].x)*(node[a].x-node[b].x)*(1.0); 27 L+=(node[a].y-node[b].y)*(node[a].y-node[b].y)*(1.0); 28 L=sqrt(L); 29 return L; 30 } 31 32 int find(int x) 33 { 34 if(x!=p[x]) 35 { 36 p[x]=find(p[x]); 37 } 38 return p[x]; 39 } 40 41 void unions(int a,int b) 42 { 43 int ra=find(a); 44 int rb=find(b); 45 if(ra==rb) 46 return; 47 p[ra]=rb; 48 } 49 int main() 50 { 51 //freopen("test.txt","r",stdin); 52 scanf("%d%d",&n,&d); 53 int i,a,b,ra,rb; 54 for(i=1;i<=n;i++) 55 { 56 scanf("%lf%lf",&node[i].x,&node[i].y); 57 } 58 init(); 59 char c[2]; 60 while(scanf("%s",c)!=EOF) 61 { 62 if(c[0]=='O') 63 { 64 scanf("%d",&repair[k]); 65 node[repair[k]].flag=true; 66 for(i=0;i<k;i++) 67 { 68 if(dis(repair[i],repair[k])<=d) 69 unions(repair[i],repair[k]); 70 } 71 k++; 72 } 73 else 74 { 75 scanf("%d%d",&a,&b); 76 ra=find(a); 77 rb=find(b); 78 if(ra==rb) 79 { 80 printf("SUCCESS\n"); 81 } 82 else 83 printf("FAIL\n"); 84 } 85 } 86 return 0; 87 }