poj2236 Wireless Network 简单并查集

本文介绍了一个使用并查集解决电脑通讯模拟问题的方法。具体实现包括初始化并查集、寻找根节点、合并节点及判断两节点是否相连等功能。通过对输入指令的解析,实现了电脑间的直接或间接联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:有若干台坏的电脑,每个电脑有一个坐标位置,并且在修好后可以与和其距离小于等于d的电脑联系,两台电脑间也可以通过其他电脑间接联系,输入‘O’(此为字母O,刚开始看成数字‘0’,改了好久才发现)后再输入数字即为修复该电脑,输入‘S’后再输入两个数字即为测试该两台电脑是否可以进行联系。


建立N并查集,当修复了某一台电脑后用新的结构体记录,编号设为x,并对之前修复过的电脑循环操作,某一次编号为y,若该两台电脑间距离小于等于d,则将并查集中x和y连接.

当测试编号为a,b的时候,就对并查集中a和b是否连接进行判断并进行输出。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<bitset>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<utility>
#define INF 1000000007
#define inf 100000000000000000
using namespace std;
typedef long long ll;
int far[1005],ran[1005],n,d,p,q,i,j,numrep=0;
char c;
void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        far[i]=i;ran[i]=0;
    }
}
int findx(int k)
{
    if(far[k]==k)return k;
    return far[k]=findx(far[k]);
}
void unite(int x,int y)
{
    x=findx(x);y=findx(y);
    if(x==y)return ;
    if(ran[x]<ran[y])far[x]=y;
    else
    {
        far[y]=x;
        if(ran[x]==ran[y])ran[x]++;
    }
}
bool same(int x,int y)
{
    return findx(x)==findx(y);
}
struct node
{
    int x,y,numb;
}com[1005],rep[1005];
double dis(node a,node b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0);
}
int main()
{
    scanf("%d%d",&n,&d);
    init(n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&com[i].x,&com[i].y);
        com[i].numb=i;
    }
    while(scanf("\n%c",&c)!=EOF)
    {
        if(c=='O')
        {
            scanf("%d",&p);
            for(i=0;i<numrep;i++)
            {
                if(dis(rep[i],com[p-1])<=d)
                {
                    unite(rep[i].numb,p-1);
                }
            }
            rep[numrep++]=com[p-1];
        }
        else if(c=='S')
        {
            scanf("%d%d",&p,&q);
            if(same(p-1,q-1))printf("SUCCESS\n");
            else printf("FAIL\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值