poj Wireless Network

来源:互联网 发布:仿真实训软件 编辑:程序博客网 时间:2024/05/22 10:33

这里写图片描述
AC情况:
这里写图片描述
大致思路:这题看到就往并查集上靠了,就是判断距离那块感觉有点费时间,不过AC了,之前WA一次,查了半天发现是FAIL输成了FALL,,难受。。。

#include<iostream>using namespace std;int x[1001];int y[1001];int r[1001] = {0};int par[1001];int ran[1001];void init(int n) {    for (int i = 0; i < n; i++) {        par[i] = i;        ran[i] = 0;    }}int find(int x) {    int j, r;    r = x;    while (par[r] != r)r = par[r];    while (par[x] != r) {        j = par[x];        par[x] = r;        x = j;    }    return r;}void unite(int x, int y) {    x=find(x);    y = find(y);    if (x != y) {        ran[x] < ran[y] ? par[x] = y : par[y] = x;        if (ran[x] == ran[y])ran[y]++;    }}int main() {    int N, D,i,op1,op2;    char c;    cin >> N >> D;    init(N);    for (i = 0; i < N; i++)        cin >> x[i] >> y[i];    while (cin >> c) {        if (c == 'O') {            cin >> op1;            op1--;            r[op1] = 1;            for (i = 0; i < N; i++)                 if (r[i]&&find(op1)!=find(i))                     if (D*D >= (x[i] - x[op1])*(x[i] - x[op1]) + (y[i] - y[op1])*(y[i] - y[op1])) {                        unite(op1, i);                    }        }if (c == 'S') {            cin >> op1 >> op2;            op1--;             op2--;            if (find(op1) == find(op2)) cout << "SUCCESS"<<endl;            else cout << "FAIL"<<endl;        }    }    return 0;}
原创粉丝点击