zoukankan      html  css  js  c++  java
  • DisJSet:Wireless Network(POJ 2236)

                    

                       无线电网络

      题目大意:就是地震后,所有的电脑都坏了,现在可以修复,而且要重新连成一个网络,两台电脑之间最大连接距离为D,两台电脑可以有中继电脑,按O修复电脑,按S测试两台电脑是否有链接,如果有就输出SUCCESS,不行就FAIL

      一看到电脑,我就联想到了查并集,这一题也不例外,我们维护在距离内的查并集就可以了,具体思路不难,每一次修复都扫描所有的节点看能否连接即可

      

      1 #include <iostream>
      2 #include <functional>
      3 #include <algorithm>
      4 #include <math.h>
      5 #define MAX 1004
      6 
      7 using namespace std;
      8 typedef int Position;
      9 typedef struct _set
     10 {
     11     int x;
     12     int y;
     13 }Point;
     14 
     15 static Point Comp[MAX];
     16 static Position Set[MAX];
     17 static bool used[MAX];
     18 static int max_dist;
     19 
     20 Position Find(Position);
     21 void Unite_Set(Position, Position);
     22 void Repaired(const int, Position);
     23 void Test(Position, Position);
     24 double Dist_Cal(Position, Position);
     25 
     26 int main(void)
     27 {
     28     int n, tmp_p, tmp_x, tmp_y;
     29     char choice;
     30     while (~scanf("%d%d", &n, &max_dist))
     31     {
     32         memset(Set, -1, sizeof(Set));
     33         memset(used, 0, sizeof(used));
     34         for (int i = 1; i <= n; i++)
     35             scanf("%d%d", &Comp[i].x, &Comp[i].y);
     36         getchar();
     37         while (~scanf("%c", &choice))
     38         {
     39             if (choice == 'O')
     40             {
     41                 scanf("%d", &tmp_p);
     42                 Repaired(n, tmp_p);
     43             }
     44             else
     45             {
     46                 scanf("%d%d", &tmp_x, &tmp_y);
     47                 Test(tmp_x, tmp_y);
     48             }
     49             getchar();
     50         }
     51     }
     52     return 0;
     53 }
     54 
     55 double Dist_Cal(Position i, Position j)
     56 {
     57     return sqrt((double)((Comp[i].x - Comp[j].x)*(Comp[i].x - Comp[j].x)) + 
     58         (double)((Comp[i].y - Comp[j].y)*(Comp[i].y - Comp[j].y)));
     59 }
     60 
     61 void Unite_Set(Position x, Position y)
     62 {
     63     Position px, py;
     64     px = Find(x); py = Find(y);
     65     if (px != py)
     66     {
     67         if (Set[px] < Set[py])//按大小求并
     68         {
     69             Set[px] += Set[py];
     70             Set[py] = px;
     71         }
     72         else
     73         {
     74             Set[py] += Set[px];
     75             Set[px] = py;
     76         }
     77     }
     78 }
     79 
     80 Position Find(Position x)
     81 {
     82     if (Set[x] < 0)
     83         return x;
     84     else return Set[x] = Find(Set[x]);
     85 }
     86 
     87 void Repaired(const int n, Position x)
     88 {
     89     used[x] = 1;
     90     for (int i = 1; i <= n; i++)
     91     {
     92         if (i == x || !used[i]) continue;
     93         if (Dist_Cal(x, i) <= (double)max_dist)
     94             Unite_Set(x, i);
     95     }
     96 }
     97 
     98 void Test(Position x, Position y)
     99 {
    100     Position px, py;
    101     px = Find(x);
    102     py = Find(y);
    103 
    104     if (px == py) puts("SUCCESS");
    105     else puts("FAIL");
    106 }

                        

  • 相关阅读:
    webdav srs相关
    How To Configure WebDAV Access with Apache on Ubuntu 14.04
    ubuntu 编译lighttpd
    srs编译及推流测试
    Compile pciutils (lspci, setpci) in Windows x86,在 Windows x86 平台下编译 pciutils (lspci, setpci)
    mingw MSYS2 区别
    Qt之美(三):隐式共享
    Qt之美(二):元对象
    Qt之美(一):d指针/p指针详解
    C++的栈空间和堆空间
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/4931985.html
Copyright © 2011-2022 走看看