码迷,mamicode.com
首页 > Web开发 > 详细

POJ 2236 Wireless Network(并查集)

时间:2015-04-18 23:27:23      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:
  就是说,给你一个二维平面和n个点的坐标,让你求出有多少个点的坐标是联通的,联通的条件就是说,他们两者之间的距离小于等于1并且满足直接联通和间接联通。

如果联通的话,我们就输出SUCESS,否则就输出FAIL。

解题思路:

  看到后,第一时间想到的就是并查集,其实用并查集维护起来是很容易的,我们只需要开一个rep[]数组,来维护每次修好的机器,然后判断这两点的距离是否小于等于d

如果小于等于d的话就把这两个点放到一个集合中去,然后,在进行S操作的时候,我们只需要判断输入的两个点的坐标是否在同一个集合中,如果在同一个集合中的话,我们

就输出SUCESS,否则就输出FAIL。

 

代码:

  

 1 # include<cstdio>
 2 # include<iostream>
 3 
 4 using namespace std;
 5 
 6 # define MAX 1004
 7 
 8 int n, d;
 9 struct node
10 {
11     int x;
12     int y;
13 }a[MAX];
14 
15 int f[MAX];
16 int rep[MAX];
17 
18 int dis ( struct node A, struct node B )
19 {
20     return ( A.x-B.x )*( A.x-B.x)+(A.y-B.y)*(A.y-B.y);
21 }
22 
23 
24 int getf( int v)
25 {
26     if ( f[v]==v )
27     {
28         return v;
29     }
30     else
31     {
32         f[v] = getf(f[v]);
33         return f[v];
34     }
35 }
36 
37 
38 void merge ( int v,int u )
39 {
40      int t1 = getf(v);
41      int t2 = getf(u);
42      if ( t1!=t2 )
43      {
44          f[t2] = t1;
45      }
46 }
47 
48 
49 
50 int main(void)
51 {
52     
53     while ( scanf("%d %d",&n,&d)!=EOF )
54     {
55        for ( int i = 1;i <= n;i++ )
56        {
57            scanf("%d %d",&a[i].x,&a[i].y);
58        }
59        for ( int i = 1;i <= n;i++ )
60        {
61            f[i] = i;
62        }
63 
64        int cnt = 0;
65        char ch;
66        while ( cin>>ch )
67        {
68            if ( ch==O )
69            {
70                int t;
71                scanf("%d",&t);
72                for ( int i = 0;i < cnt;i++ )
73                {
74                    if ( dis ( a[t],a[rep[i]] ) <= d*d )
75                    {
76                        merge( rep[i],t);
77                    }
78                }
79                rep[cnt++] = t;
80            }
81            else
82            {
83                int x,y;
84                scanf("%d %d",&x,&y);
85                x = getf(x);
86                y = getf(y);
87                if ( x==y )
88                     printf("SUCCESS\n");
89                else
90                     printf("FAIL\n");
91 
92            }
93        }
94     }
95 
96     return 0;
97 }

 

POJ 2236 Wireless Network(并查集)

标签:

原文地址:http://www.cnblogs.com/wikioibai/p/4438160.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!