IT民工
加油!

并查集判断两个点是否联通,只需看他们的根节点是不是相同。

/*Accepted    224K    2688MS    C++    1339B    2012-08-23 16:32:01*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
const double eps = 1e-8;
const int MAXN = 1 << 10;
int n, in[MAXN], p[MAXN], m;
double d;

struct point
{
    double x, y;
}t[MAXN];

double dist(point a, point b)
{
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

int find_set(int x)
{
    return p[x] == x ? x : (find_set(p[x]));
}

void union_set(int a, int b)
{
    int na, nb;
    na = find_set(a), nb = find_set(b);
    if(na != nb)
    {
        p[na] = nb;
    }
}

void Prepare()
{
    int i;
    for(i = 1; i <= n; i ++)
        scanf("%lf%lf", &t[i].x, &t[i].y);
    m = 0;
    for(i = 1; i < MAXN; i ++) p[i] = i;
}

int main()
{
    char op[5];
    int a, b, i;
    scanf("%d%lf", &n, &d);
    Prepare();
    while(scanf("%s", op) != EOF)
    {
        if('O' == op[0])
        {
            scanf("%d", &a);
            for(i = 0; i < m; i ++)
            {
                if(dist(t[in[i]], t[a]) < eps + d)
                    union_set(in[i], a);
            }
            in[m ++] = a;
        }
        else
        {
            scanf("%d%d", &a, &b);
            if(find_set(a) == find_set(b))
                printf("SUCCESS\n");
            else printf("FAIL\n");
        }
    }
    return 0;
}
posted on 2012-08-23 16:34  找回失去的  阅读(222)  评论(0编辑  收藏  举报