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

    题目大意:

    给你N台电脑,从1-N。一个数字,表示两台计算机的最大通信距离,超过这个距离就无法进行通信。然后分别告诉这些电脑的坐标,接下来有两种操作,第一种O表示这点电脑修好,第二种S,表示测试这两台电脑能不能进行正常的通信

     

    解题思路:

    并查集的简单应用,对每次修好的电脑对其它已经修好的电脑遍历,如果距离小于等于最大通信距离就将他们合并。之后判断2台电脑是不是一个集合中就KO了

     1 #pragma comment(linker, "/STACK:1024000000,1024000000")
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<math.h>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<set>
    10 #include<bitset>
    11 #include<map>
    12 #include<vector>
    13 #include<stdlib.h>
    14 #include <stack>
    15 using namespace std;
    16 #define PI acos(-1.0)
    17 #define max(a,b) (a) > (b) ? (a) : (b)
    18 #define min(a,b) (a) < (b) ? (a) : (b)
    19 #define ll long long
    20 #define eps 1e-10
    21 #define MOD 1000000007
    22 #define N 1006
    23 #define inf 1e12
    24 int n,d;
    25 int vis[N];
    26 int fa[N];
    27 struct Node{
    28    int x,y;
    29 }node[N];
    30 void init(){
    31    for(int i=0;i<N;i++){
    32       fa[i]=i;
    33    }
    34 }
    35 int find(int x){
    36    return x==fa[x]?x:fa[x]=find(fa[x]);
    37 }
    38 void merge(int x,int y){
    39    int root1=find(x);
    40    int root2=find(y);
    41    if(root1==root2) return;
    42    if((node[x].x-node[y].x)*(node[x].x-node[y].x)+(node[x].y-node[y].y)*(node[x].y-node[y].y)<=d*d){
    43       fa[root1]=root2;
    44    }
    45 }
    46 int main()
    47 {
    48         scanf("%d%d",&n,&d);
    49         init();
    50         memset(vis,0,sizeof(vis));
    51         for(int i=1;i<=n;i++){
    52            scanf("%d%d",&node[i].x,&node[i].y);
    53         }
    54         char s[3];
    55         int p,q;
    56         while(scanf("%s",s)!=EOF){
    57            if(s[0]=='O'){
    58               scanf("%d",&p);
    59               vis[p]=1;
    60               for(int i=1;i<=n;i++){
    61                  if(vis[i] && i!=p){
    62                     merge(i,p);
    63                  }
    64               }
    65            }else{
    66               scanf("%d%d",&p,&q);
    67               if(find(p)==find(q)){
    68                printf("SUCCESS
    ");
    69               }else{
    70                  printf("FAIL
    ");
    71               }
    72            }
    73         }
    74 
    75     return 0;
    76 }
    View Code
  • 相关阅读:
    1021 个位数统计
    1020 月饼
    1019 数字黑洞
    1018 锤子剪刀布
    1017 A除以B
    1016 部分A+B
    1015 德才论
    1014 福尔摩斯的约会
    cocos2d 间隔动作
    cocos2d 瞬时动作
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4945335.html
Copyright © 2011-2022 走看看