zoukankan      html  css  js  c++  java
  • poj2236(并查集)

    题目链接:http://poj.org/problem?id=2236

    题意:

      关于电脑之间的连接问题,给出一个距离限制,一台电脑与一台电脑是连接的有两种情况,一种是他们之间的距离小于限制距离,另一种是他们之间的距离超过了限制距离,但是他们间接通过其他在限制距离内的电脑互相连接。当然要连接的话首先要保证电脑是激活的状态,然后S表示询问,叫你判断询问的两台电脑之间是否连接。

    思路:

      简单的并查集做法,只是合并的时候加上判断条件,首先在距离内的才能直接连接,还有只有连接的两台电脑都处于激活状态。水~

    代码:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cmath>
     4 using namespace std;
     5 
     6 int fa[1010];
     7 int n, max_dis;
     8 
     9 struct Num
    10 {
    11     int id;
    12     int x;
    13     int y;
    14     int flag;    //判断是否修复
    15 } num[1010];
    16 
    17 int dis(Num a, Num b)    //计算距离,返回的是距离的平方
    18 {
    19     return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    20 }
    21 
    22 void init(int n)
    23 {
    24     for(int i = 1; i <= n; i++)
    25     {
    26         num[i].id = i;
    27         fa[i] = i;
    28         num[i].flag = 0;
    29     }
    30     return;
    31 }
    32 
    33 int find(int x)
    34 {
    35     return (fa[x] == x ? x : (fa[x] = find(fa[x])));
    36 }
    37 
    38 void unite(Num a, Num b)
    39 {
    40     int r1 = find(a.id);
    41     int r2 = find(b.id);
    42     if(r1 == r2)
    43     {
    44         return;
    45     }
    46     else
    47     {
    48         if(dis(a, b) <= (max_dis * max_dis))
    49         {
    50             fa[r2] = r1;
    51         }
    52     }
    53 }
    54 
    55 int main()
    56 {
    57     ios::sync_with_stdio(false);
    58     while(cin >> n >> max_dis)
    59     {
    60         init(n);
    61         for(int i = 1; i <= n; i++)
    62         {
    63             cin >> num[i].x >> num[i].y;
    64         }
    65         char ch;
    66         int p, q;
    67         //getchar();
    68         while(cin >> ch)
    69         {
    70             if(ch == 'O')    //这里是大写字母O,不是0
    71             {
    72                 cin >> p;
    73                 num[p].flag = 1;
    74                 for(int i = 1; i <= n; i++)
    75                 {
    76                     if(num[i].flag == 1 && i != p)
    77                         unite(num[p], num[i]);
    78                 }
    79             }
    80             else if(ch == 'S')
    81             {
    82                 cin >> p >> q;
    83                 if(find(num[p].id) == find(num[q].id))
    84                 {
    85                     cout << "SUCCESS" << endl;
    86                 }
    87                 else
    88                 {
    89                     cout << "FAIL" << endl;    //最近有点不在状态啊,找了这么久的错误,才发现是FAIL写成了FALL……
    90                 }
    91             }
    92         }
    93     }
    94     return 0;
    95 }
  • 相关阅读:
    union
    大端和小端
    迭代器
    STL
    动态内存管理2
    动态内存管理
    关于 FlexBox
    CSS的居中问题
    操作符
    JavaScript介绍
  • 原文地址:https://www.cnblogs.com/friend-A/p/9419069.html
Copyright © 2011-2022 走看看