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 }
View Code

 

posted @ 2013-06-12 01:23  longlongago  Views(176)  Comments(0Edit  收藏  举报