poj3977

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;

pair<int,int> cor[1005];
int n,d,par[1005],rk[1005];
bool isconnect(int i1,int i2,int d)
{
    return d*d>=(cor[i1].first-cor[i2].first)*(cor[i1].first-cor[i2].first)+(cor[i1].second-cor[i2].second)*(cor[i1].second-cor[i2].second);
}
void inital()
{
    for(int i=0;i<=n;i++)
    {
         par[i]=i;rk[i]=0;
    }
}
int f(int x)
{
    if(par[x]==x)
        return x;
    else
        return par[x]=f(par[x]);
}
void unite(int n1,int n2)
{
    n1=f(n1);
    n2=f(n2);
    if(n1==n2)
        return ;
    if(rk[n1]<rk[n2])
    {
        par[n1]=n2;
    }
    else
    {
        par[n2]=n1;
        if(rk[n1]==rk[n2])
            rk[n1]++;
    }
}
bool same(int n1,int n2)
{
    n1=f(n1);
    n2=f(n2);
    return n1==n2;
}
int main()
{
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&cor[i].first,&cor[i].second);
    char ch;
    int num,cnt=0;
    vector <int> wire;
    inital();
    while(cin>>ch)
    {
        if(ch=='O')
        {
            scanf("%d",&num);
             vector<int>::iterator it = find( wire.begin( ), wire.end(), num );
            if(it!=wire.end())
            {
                continue;
            }

            for(int i=0;i<wire.size();i++)
            {
                if(isconnect(num,wire[i],d))
                {
                    unite(num,wire[i]);
                }
            }
            wire.push_back(num);
            cnt++;
        }
        else if(ch=='S')
        {
            int n1,n2;
            scanf("%d%d",&n1,&n2);
            if(same(n1,n2))
                printf("SUCCESS\n");
            else printf("FAIL\n");
        }

    }
   return 0;
}

W了一次,原来是把距离判断公式写错了,我也是无语了

此题用的是并查集,但是数据似乎比较小,不需要写这么详细

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值