POJ 2236 Wireless Network

并查集。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;

const int maxn=1001+10;
int n,d;
vector<int>G[maxn];
int x[maxn],y[maxn];
bool flag[maxn];
int f[maxn];

int DIS(int a,int b)
{
    return (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]);
}

int Find(int x)
{
    if(x!=f[x]) return f[x]=Find(f[x]);
    return f[x];
}

int main()
{
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
    for(int i=0;i<=n;i++) flag[i]=0,f[i]=i,G[i].clear();
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(DIS(i,j)<=d*d)
            {
                G[i].push_back(j);
                G[j].push_back(i);
            }
        }
    }
    char op[5];
    while(~scanf("%s",op))
    {
        if(op[0]=='O')
        {
            int b1; scanf("%d",&b1);
            if(flag[b1]==1) continue;
            flag[b1]=1;

            for(int i=0;i<G[b1].size();i++)
            {
                if(flag[G[b1][i]]==0) continue;
                int f1=Find(b1),f2=Find(G[b1][i]);
                if(f1!=f2) f[f1]=f2;
            }
        }
        else
        {
            int b1,b2; scanf("%d%d",&b1,&b2);
            int f1=Find(b1),f2=Find(b2);
            if(f1==f2) printf("SUCCESS
");
            else printf("FAIL
");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5352563.html