zoukankan      html  css  js  c++  java
  • POJ 2236 Wireless Network(并查集)

    题目大意:
      就是说,给你一个二维平面和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
    ");
    89                else
    90                     printf("FAIL
    ");
    91 
    92            }
    93        }
    94     }
    95 
    96     return 0;
    97 }
  • 相关阅读:
    Appium+python自动化3-启动淘宝app
    Appium+python自动化2-环境搭建(下)
    Appium+python自动化1-环境搭建(上)
    postman提取返回值
    Android studio(AS)的下载和安装
    monkey的安装和配置
    配置自己的CentOS7服务器
    mac-homebrew安装太慢
    vue.js中祖孙通信之provide与inject
    nginx location 以及 proxy_pass 的几种情况 以/结尾的问题
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4438160.html
Copyright © 2011-2022 走看看